Red de conocimiento informático - Aprendizaje de programación - Ejemplo de cómo utilizar RSA para implementar cifrado asimétrico en Java

Ejemplo de cómo utilizar RSA para implementar cifrado asimétrico en Java

El código es el siguiente. Requiere un paquete jar commons-codec-1.9.jar para la conversión a Base64.

¿importar?Cipher;

importar?javax.crypto.IllegalBlockSizeException;

importar?java.io.ByteArrayOutputStream;

¿importar? java.io.UnsupportedEncodingException;

importar?java.security.Cipher;

importar?*;

importar?java.security.interfaces.RSAPrivateKey;

importar?java.security.interfaces.RSAPublicKey;

importar?java.security.spec.PKCS8EncodedKeySpec;

importar?java.security.spec.X509EncodedKeySpec;

importar?X509EncodedKeySpec;

public?class?RSAUtils?{

//?EncryptionMethod

public?RSA";

p>

//?Algoritmo de firma

private?static?final?String?SIGNATURE_ALGORITHM?=?"SHA1WithRSA";

/?Longitud inicial de el par de claves creado

private?static?final?int?KEY_SIZE?=?512;

/?Formato de codificación de caracteres

private?static?final? String?CHARSET?= ?"UTF-8";

/? Tamaño máximo de texto plano cifrado RSA

private?static?final?int?MAX_ENCRYPT_BLOCK?=?117;

/? Tamaño máximo de texto cifrado de descifrado RSA

private?static?final?int?MAX_DECRYPT_BLOCK?=?128;

private?KeyFactory?keyFactory;

público?RSAUtils()?throws?NoSuchAlgorithmException?{

keyFactory?=?KeyFactory.getInstance(ALGORITHM);

}

/*** * *?Cifrado de clave privada* *?@param?cadena de contenido a cifrar *?@param?privateKey?clave privada *?@return?Cadena cifrada (codificada en BASE64) */

public?String? encryptByPrivateKey(String?content,?String?privateKey)?throws?Exception?{

String?resultado;

¿probar?(ByteArrayOutputStream?out?=?new? ByteArrayOutputStream()? {

byte[]?keyBytes?=?new?Base64().decode(privateKey);

PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?

PKCS8EncodedKeySpec( keyBytes);

PrivateKey?pKey?=?keyFactory.generatePrivate(pkcs8KeySpec);

Cipher?cipher?=?Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.ENCRYPT_MODE,?pKey);

byte[]?data?=?content.getBytes(CHARSET);

write2Stream(cipher ,?data,?out) ;

byte[]?resultBytes?=?out.toByteArray();

resultado?=?Base64.encodeBase64String(resultBytes);

}?{

lanzar?nueva?Excepción(e);

}

devolver?resultado;

}

/** *?Descifrado de clave pública* *?@param?content cadena cifrada (cifrado BASE64) *?@param?publicKey?@return */

public?String ? decryptByPublicKey(String?content,?String?publicKey)?throws?Exception?{

String?result?=?"";

probar?(ByteArrayOutputStream?out?=? nuevo ?ByteArrayOutputStream())?{

byte[]?keyBytes?=?new?Base64().decode(publicKey);

X509EncodedKeySpec?x509KeySpec?=?new?X509EncodedKeySpec ( keyBytes);

PublicKey?=?keyFactory.generatePublic(x509KeySpec);

Cipher?init(Cipher.DECRYPT_MODE,?pKey);

byte[ ] ?data?=?Base64.decodeBase64(content);

write2Stream(cipher,?data,?out);

byte[]?result?=?new?String( resultBytes );

}¿capturar?(¿Excepción?e)?{

lanzar?¿nueva?Excepción(e);

}

return?result;

}

/** *?Cifrado de clave pública* *?@param?cadena de contenido a cifrar *?@param?publicKey?clave pública *? return?Cadena cifrada (codificada en BASE64) */

public?String?encryptByPublicKey(String?content,?String?publicKey)?throws?Exception?{

String?result? ?"" ;

¿intentar?(ByteArrayOutputStream?out?=

?new?ByteArrayOutputStream())?{

byte[]?keyBytes?=?new?Base64().decode(publicKey);

X509EncodedKeySpec?x509KeySpec?=?new? X509EncodedKeySpec(keyBytes);

PublicKey?=?keyFactory.generatePublic(x509KeySpec);

Cifrado?init(Cipher.ENCRYPT_MODE,?pKey);

byte []?data?=?content.getBytes(CHARSET);

write2Stream(cipher,

datos,?out);

byte[]?resultBytes ?=?out.toByteArray();

resultado?=?Base64.encodeBase64String(resultBytes);

}?{

throw?new?Exception( e);

}

return?result;

}

/** *?Descifrado de clave privada* *?@param ?cadena cifrada de contenido *?@param?privateKey?private key *?@return?decryptedString */

public?String?decryptByPrivateKey(String?content,?String?privateKey)?throws?Exception?{

¿Cadena? keyBytes?=?new?Base64().decode(privateKey);

PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec( keyBytes);

PrivateKey?pKey?=?keyFactory . generatePrivate(pkcs8KeySpec);

Cipher?cipher?=?Cipher.getInstance(ALGORITHM);

cipher.init(Cipher.DECRYPT_MODE,?pKey);< / p>

byte[]?data?=?Base64.decodeBase64(content);

write2Stream(cipher,?data,?out);

byte[]? ?=?new?String(resultBytes);

}¿capturar?(¿Excepción?e)?{

lanzar nueva excepción(e);

}

resultado devuelto;

}

¿privado?lanzamientos

BadPaddingException,?IllegalBlockSizeException {

int?dataLen ? =?data.length;

int?offSet?=?0;<

/p>

byte[]?cache;

int?i?=?0;

/?Descifrar segmento de datos

while(dataLen? -?offSet?>?0)?{

if?(dataLen?-?offSet?>?MAX_DECRYPT_BLOCK)?{

caché?=?cipher.doFinal(datos,? offSet,?MAX_DECRYPT_BLOCK);

} else?offSet);

}

out.write(cache,?0,?cache.length);

i++;

offSet?=?i?*?MAX_DECRYPT_BLOCK;

}

}

}

/** *?Utilice la clave privada para generar una firma digital para la información* *?@param?data Datos cifrados *?@param?privateKey?Clave privada (codificada en BASE64) *?@return?sign */

¿público?String?sign(String?data,?String?privateKey)?throws?Exception?{

String?result?=?"" ;

intentar?{

byte[]?keyBytes?=?new?Base64().decode(privateKey);

PKCS8EncodedKeySpec?pkcs8KeySpec?=?new?PKCS8EncodedKeySpec(keyBytes);

PrivateKey?privateK?=?keyFactory.generatePrivate(pkcs8KeySpec);

Firma?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initSign( privateK);

signature.update(parse2HexStr(data).getBytes (CHARSET));

resultado?=?new?Base64().encodeToString(signature.sign()) ;

}?{

lanzar?nueva?Excepción(e);

}

retorno?resultado;

}

/** *?Verificar firma digital* *?@param?data?Datos cifrados *?@param?publicKey?Clave pública (codificación BASE64) *?@param?sign?Digital firma*?@ return *?@throws?Exception */

public?boolean?verify(String?data,?String?publicKey,?String?sign)?throws?Exception?{

resultado booleano;

¿probar?{

byte[]?keyBytes?=?new?Base64().decode(publicKey);

X509EncodedKeySpec?keySpec? =?new?X509EncodedKeySpec(keyBytes);

PublicKey?publicK?=

?keyFactory.generatePublic(keySpec);

Firma?signature?=?Signature.getInstance(SIGNATURE_ALGORITHM);

signature.initVerify(publicK);

firma .update(parse2HexStr(data).getBytes(CHARSET) );

resultado?=?signature.verify(new?Base64().decode(sign));

}? ¿captura?(¿Excepción?e)?{

lanzar?¿nueva?Excepción(e);

}

retorno?resultado;

}

/** *?Convertir binario a hexadecimal* *?@param?data *?@return */

public?static?String?parse2HexStr( String?data) ?throws?Exception?{

String?result?=?"" ;

intenta?{

byte[]?buf?= ?data.getBytes (CHARSET);

StringBuffer?sb?=?new?StringBuffer();

for?(int?i?=?0;?i?

Cadena?{

hex?=?0'?0'?+?hex;

}

sb.append(hex.toUpperCase());

}

resultado?=?sb.toString();

}? p>

Resultado?=?sb.toString(;

}?{

lanzamiento?new?Exception(e);

}

return?result;

}

/** *?Generar claves públicas y privadas*/

public? keyPairGenerator.getInstance(ALGORITHM) );

keyPairGenerator.initialize(KEY_SIZE);

KeyPair?keyPair?=?keyPairGenerator.generateKeyPair();

RSAPublicKey?rsaPublicKey ?=?(RSAPublicKey )?keyPair.getPublic();

RSAPrivateKey?rsaPrivateKey?=?(RSAPrivateKey)?keyPair.getPrivate();

String?publicKey?=?Base64 .encodeBase64String(rsaPublicKey. getEncoded());

String?privateKey?=?Base64.encodeBase64String(rsaPublicKey.getEncoded());

String?encodeBase64String(rsaPrivateKey.getEncoded());

System.out.println("publicKey="? +?publi

cKey?+?" \nprivateKey="? +?privateKey);

}?{

lanzar?new?Exception(e);

}

}

public?static?void?main(String[]?args)?private_key =?"MIICeAIBADANBgkqhkiG9w0BAQEFAASCAmIwggJeAgEAAoGBAKeYGXH6Vz+m+KuL11RDRaNdHB4YQeZgqpJGPRSwBelgvEoHu2/fNs1bmgfJ hI8lhr /o/Hy8EFB/I/DDyLcCU4bCLtxpki8edC+ KJR2WvyYfnVmWEe /3q2jSVKRf81868q9Cd3MMfrQPMsY4x0TQ0GtOf/nMSMbAltV2W8J86IfAgMBAAECgYEApYu4lr2SMW3ddJZNvQ42W4g9nfyYG9igpJx8+VJmhIDpfLbmjzsOBwvUupx0 NHH9CNQ7k3qxItJzz f+W5C+lesEOAqdO5nahRZsL8BIDoxTEn2j+1GXkzQw3vqPY50xqRnZsoP5TyNNsOM7KYaOoz4VFMdVIFwoT3OKM5z7mxgECQQD51r17WZDSa/kucaH7gCOePxJPS6Ust0eVd5tBOM pFzD/VtziogSIW yhGKkLH0SyTJEe91CCpdpxufLSZgIiN5AkEAq7ojtvU4twak1N1/1qX+t8f5wD8i/8GU702Pe CwkGI5ymrARq+W2yCuvU1bouXBhjKHV4KhafKYixdHUMg00VwJAYVUjpLaUE SY3gbyLWqvlNHV l8LaLtwwAO17JgXNaei7Ef8JNtHf6i95VTyJn8cCEqEDwhSuVNb8wp6azWKh0IQJBAJHrcT2d0bt0IcvfCynRk0eG3WnGPG8mhu9w8GAk4ecb47YdtmZio5YjyK8AQnCQVd OyEJL9eyY/ 5XxCeBSvs7ECQQCKQ2f5HLDkkHvc6rlaHCJmqNRCS+CxhoaiaSPYLAac7WXmb614ACLECc86C/nkefTq0SNpUDVbGxVpJi9/FOUF";

String?public_key? "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKB gQCnmBlx+lc/ pviri9dUQ0WjXRweGEHmYKqSRj0UsAXpYLxKB7tv3zbNW5oHyYSPJYa/6Px8vBBQfyPww8i3AnFOGwi7caZIvHnQviiUdlr8mH51Z lhHv96to0lSkX/NfOvKvQndzDH60DzLGOMdE0NBrTn /5zEjGwJbVdlvCfOiHwIDAQAB";

RSAUtils?RSAUtils?RSAUtils();

String?encryptByPublicKey?=?rsaUtil.encryptByPublicKey("¡Hola! " ,?PUBLIC_KEY);

System.out.println(encryptByPublicKey);

String?decryptByPrivateKey?=?rsaUtil.decryptByPrivateKey( encryptByPublicKey

,?PRIVATE_KEY);

System.out.println(encryptByPublicKey);

String?out.println(decryptByPrivateKey);

String?encryptByPrivateKey?=? rsaUtil. encryptByPrivateKey("¡Hola!",?PRIVATE_KEY);

System.out.println(encryptByPrivateKey);

String?decryptByPublicKey?=?rsaUtil.decryptByPublicKey(encryptByPrivateKey,?PUBLIC_KEY );

System.out.println(decryptByPublicKey);

¿Cadena?

System.out.println("signo:"? +?signo);

System.out.println(rsaUtil.verify("1234",?PUBLIC_ KEY,?sign));

}

}