Cómo cifrar y descifrar una cadena de clave pública de iOS
El primer paso es crear un certificado autofirmado.
La forma más fácil y rápida es abrir el terminal y utilizar openssl (incluido con Mac OS X) para generar una clave privada y un certificado x509 autofirmado.
OpenSSL req-x509-out public_key .der-out form der-new-new key RSA:1024-keyut private_key .PEM-days 3650
Simplemente siga la entrada rápida del comando línea.
Algunas notas:
Public_key.der genera un certificado x509 autofirmado, que es lo que queremos usar.
Private_key.pem es la clave privada de salida utilizada para el descifrado. Por favor manténgalo correctamente.
Rsa: 1024 donde 1024 es la longitud de la clave, 1024 es relativamente segura. Si es más seguro, puede utilizar 2048, pero el coste de cifrado y descifrado también aumentará.
-days: Hora de vencimiento del certificado, se debe agregar este parámetro. El tiempo de vencimiento predeterminado del certificado es de 30 días. Generalmente no queremos que el certificado caduque tan rápido, por lo que escribimos aquí un número de días más apropiado, como 3650 (10 años).
En realidad, esta línea de comando contiene varios pasos (la razón por la que estudié los siguientes pasos es porque tengo una clave privada de private_key.pem a mano y quiero usarla para generar el certificado x509 directamente , también solo use 2-3) a continuación.
1) Crear una clave privada.
OpenSSL gen RSA-out private _ key . PEM 1024
2) Cree una solicitud de certificado (ingrese la información según las indicaciones)
OpenSSL req-new -out cert . CSR-key private_key . PEM
3) Certificado raíz autofirmado
OpenSSL x509-req-in cert. CSR-out public_key. formulario de salida clave privada _ clave PEM-days 3650
2. Arrastre public_key.der a xcode. Si no hay ningún problema con el archivo, puede abrirlo directamente en xcode y ver información diversa sobre el certificado.
El segundo paso es utilizar public_key.der para el cifrado.
Importar seguridad.
2. Coloque public_key.der en mainBundle (normalmente simplemente arrástrelo a Xcode).
3. Lea la clave pública de public_key.der
4.
El siguiente es un código de referencia (solo se puede utilizar para cifrar contenido con una longitud menor o igual a 116 bytes y es adecuado para cifrar contraseñas.
Se utiliza ARC, pero cabe señalar que algunos recursos deben liberarse mediante CFRealse)
RSA.h
//
// ?RSA. h
//
#Importar ltfoundation/foundation
@interface RSA: NSObject {
SecKeyRef publicKey
Certificado SecCertificateRef;
Política SecPolicyRef;
Confianza SecTrustRef;
tamaño _ t maxPlainLen
}
-(ns data *)encryptWithData: (ns data *)contenido;
-(ns data *)encryptWithString: (ns string *)contenido;
@end
RSA.m
//
// ?RSA.m
//
#Importar " RSA.h"
@implementationRSA
- (id) inicialización {
self = [super init];
ns string * ruta de clave pública =[[paquete principal de paquete ns]ruta para el recurso: @ " public _ key "
de tipo: @ " der "];
if (publicKeyPath == nil) {
NSLog(@"pub . der not found");
Devolver nil
}
ns fecha * público contenido del archivo clave =[ns data datawithcontentsofile: ruta de clave pública];
if (publicKeyFileContent == nil) {
NSLog(@"No se puede leer desde pub.der");
Devuelve nil
}
certificado = SecCertificateCreateWithData(kCFAllocatorDefault, (_ _ bridge CFDataRef)publicKeyFileContent);
if (certificado == nil) {
NSLog(@"No se puede leer el certificado del editor");
Devolver nil
}
política = SecPolicyCreateBasicX509 ();
Código de retorno del estado del sistema operativo = SecTrustCreateWithCertificates(certificado, política, confianza);
if (returnCode! = 0) {
NSLog(@ " Error en SecTrustCreateWithCertificates.
Código de error: ld", Código de retorno);
Devuelve nil
}
SecTrustResultType tipo de resultado de confianza;
código de retorno = SecTrustEvaluate( confianza, tipo de resultado de confianza);
if (returnCode!= 0) {
NSLog(@"SecTrustEvaluate falló. Código de error: ld", código de retorno);
Devolver nil
}
clave pública = SecTrustCopyPublicKey(trust);
if (publicKey == nil) {
NSLog (@ " SecTrustCopyPublicKey fail ");
Devolver nil
}
maxPlainLen = SecKeyGetBlockSize(clave pública)-12;
Devolver self;
}
-(ns data *)encryptWithData: (ns data *)contenido {
tamaño _ t simple len =[longitud del contenido];
if(plain len gt; maxPlainLen) {
NSLog(@ "El contenido (ld) es demasiado largo, debe ser ltld", PlainLen, maxplain len);
Devuelve nil
}
void * Plain = malloc(plain len);
[Contenido getBytes: Plain
Longitud : Plain Len];
size_t cipher len = 128; //La longitud actual de la clave RSA es 128 bytes
void * cipher = malloc(cipher len);
p>Código de retorno del estado del sistema operativo = cifrado de clave de segundo (clave pública, kSecPaddingPKCS1, simple,?
plainLen, cifrado, cifrado len);
NSData * resultado = nil
if (código de retorno! = 0) {
NSLog(@"SecKeyEncrypt falló.
Código de error: ld", código de retorno);
}
De lo contrario {
resultado =[ns data dataWithBytes: cipher?
Longitud: cifrado len];
}
Gratis (color liso);
Gratis (contraseña);
Devolver resultados;
}
-(ns data *)cifrar con cadena: (ns string *)content {
return[self encryptWithData:[datos de contenido usando codificación:nsu Codificación de cadena TF 8]];
}
- (void)dealloc{
CFRelease(certificado);
CFRelease(trust );
CFRelease(política);
cf release(clave pública);
}
@end
Cómo utilizar:
RSA * RSA =[[RSA alloc]init];
if (rsa!=zero){
NSLog(@ " @",[RSA encryptWithString: @"test"]);
}
En caso contrario {
NSLog(@ " error de inicio de RSA ");
}
p>
}