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>
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? buf.length; ?i++)?{
Cadena?{
hex?=?0'?0'?+?hex;
} p>
sb.append(hex.toUpperCase());
}
resultado?=?sb.toString();
}? p>
Resultado?=?sb.toString(;
}?{
lanzamiento?new?Exception(e);
} p>
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));
}
}