Colección de citas famosas - Slogan de motivación - ¿Cómo implementa iOS el cifrado y descifrado RAS?

¿Cómo implementa iOS el cifrado y descifrado RAS?

El primer paso es crear un certificado autofirmado.

1. La forma más sencilla 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? ltfundación/fundación . h gt;

@interface? ¿RSA? :?NSObjeto? {

¿SecKeyRef? publicKey

SecCertificateRef? Certificado;

SecPolicyRef? Política;

SecTrustRef? Confianza;

size_t? maxPlainLen

}

-?(NSData?*)?encryptWithData: (NSData?*)content;

-?(NSData?*)?encryptWithString: (NSString?*) contenido;

@end

RSA.m

//

//?RSA.m

//

#¿Importar? " RSA.h "

@implementación? República de Sudáfrica

-?(id)init? {

¿Yo? =?[¿Súper? init];

NSString? *¿Ruta de clave pública? =?[[NSBundle? paquete principal]? pathForResource: @"public_key "

de tipo: @ " der "];

¿Si? (publicKeyPath? ==? cero)? {

NSLog(@ "¿Puede? ¿No es así? ¿Encontrado? pub. der ");

¿Regresión? Cero;

}

NSDate? *¿Contenido de archivo de clave pública? =?[NSData? datawithcontentsofile:ruta de clave pública];

¿Si? (¿publicKeyFileContent?==?cero)? {

NSLog(@ "¿Puede? ¿No es así? ¿Leyendo? ¿Desde dónde? pub. der ");

¿Volver? Cero;

}

¿Certificado? =?SecCertificateCreateWithData(kCFAllocatorDefault,?(?__bridge?CFDataRef)publicKeyFileContent);

¿Si? (¿certificado?==?cero)? {

NSLog(@ "¿Puede? ¿No es así? ¿Leyendo? ¿Certificado? ¿De dónde? pub. der ");

¿Volver? Cero;

}

¿Política? =?SecPolicyCreateBasicX509();

¿Estado? ¿Código de retorno? =?SecTrustCreateWithCertificates(certificado, política,? amp confianza);

¿Si? (returnCode?!=?0)?{

NSLog(@ " SecTrustCreateWithCertificates? Error.

? ¿error? Código:? ld ", código de retorno);

¿Retorno? Cero;

}

SecTrustResultType?trustResultType

returnCode?=?SecTrustEvaluate(confianza , amptrust resulttype);

If? (returnCode?!=?0)?{

NSLog(@"SecTrustEvaluate? fallen.?Error?Code:?ld", código de retorno );

¿Devolver?

}

¿Clave pública? =?SecTrustCopyPublicKey(confianza);

Si ==? ? {

NSLog(@"SecTrustCopyPublicKey? Error");

¿Devolución cero;

}

maxPlainLen?=?SecKeyGetBlockSize (publicKey)?-?12;

Return?self;

}

-?(NSData?*)?encryptWithData: (NSData?*) contenido ? {

PlainLen? =?[Contenido?Longitud];

Si? >

NSLog(@ "Contenido(ld)? ¿Sí? ¿También? ¿Dragón? ¿Debe? lt? ld ",PlainLen? maxPlainLen);

¿Regresar?

}

*¿Plain? =?Mallock(Plain);

[Contenido? ];

size_t? =?128;? //¿La longitud de la clave RSA actual es de 128 bytes? *Contraseña ;

¿Estado de retorno? (publicKey,kSecPaddingPKCS1,?plain?

Planlen?contraseña?ampcipher len);

NSData? *resultado?=?cero;

Si? ?!=?0)?{

NSLog(@"SecKeyEncrypt? falló.

? ¿error? Código:? ld ", código de retorno);

}

¿Qué pasa si? {

Resultado?=?[NSData?dataWithBytes: ¿Contraseña?

Longitud: cifrado len];

}

Gratis (simple);

Gratis (contraseña);

¿Volver? /p>

}

-?(NSData?*)?encryptWithString: (NSString?*)¿Contenido? {

¿Devolver datos usando codificación: nsu TF 8? codificación]];

}

-?(inválido)dealloc{

CFRelease(certificado);

CFRelease(confianza);

CFRelease(política);

cf liberación(clave pública);

}

@end

RSA? =?[RSA? alloc];

Si? ?cero)? {

NSLog(@"@",[rsa?encryptWithString:@"test"]);

}

¿Qué pasa si

NSLog(@"init?rsa?Error");

}