我想用java中的給定公鑰(公鑰是一個字符串)以rsa/ecb/pkcs1填充模式對字符串進行編碼。如何使用java中給定的公鑰對rsa/ecb/pkcs1填充模式下的文本進行編碼?
我也想以UTF-8格式顯示結果 怎麼辦?
我想用java中的給定公鑰(公鑰是一個字符串)以rsa/ecb/pkcs1填充模式對字符串進行編碼。如何使用java中給定的公鑰對rsa/ecb/pkcs1填充模式下的文本進行編碼?
我也想以UTF-8格式顯示結果 怎麼辦?
假設你正在使用一個有效的RSA密鑰,你需要:
從字符串轉換你的公鑰實際公鑰對象
//This code is incorrect. You'll need bouncy castle for PKCS1
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyBytes = Base64().getDecoder.decode(publicKey.getBytes()); //assuming base64 encoded key
PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes);
RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic(KeySpec);
獲取字節的明文
看看這個答案的步驟1-3:RSA Encrypt/Decrypt in Java。請記住使用正確的算法規格,對於您的情況PKCS1
很可能您的密文不會僅使用UTF-8字符,因此您可能希望使用Base 64編碼文本來顯示密文。 Base 64能夠顯示所有那些奇怪的字符ascii值。
只需使用:Base64.getEncoder().encodeToString(cipherTextBytes)
我這樣做代碼:
String pub = "MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEA4IJZLsjlx+o4RSvafaAcReoNnzrI0UXu7kZyXPe31ql32X9AvhC6QQIUmLkr1Evm0zP/SgVG9YX3DSqBUgPo04iv1I1/wNKwAf1/uH9EiiqdpczefyxxnzJiKUTcx2/4mA4E4QxCIL5JsZb78WoYZrd2kToW/WD01MnSFiCgSyjGdd812GY2EVzfvlv8kYuti3icMUyitEfHhtw8cAWI6/nVrRPNs0e5NsvtZJ0nfrXsfQDR0C7+ivQK+fQabi8oRGsbTZceAvVlqVE669zoIwIFLcB+eYXTxbka4E7veUMpaF9w//HdwVS2y/2jJiI+16qPStQQPIKQ4Cucoif7/UHfIBuVGVJ5MIVyK7NC7TV/lyoXmyo7ZcnVZnI7rZcw5/qZcqaZ0VCrzvHijwTK7100hOOjiarvRa2OJGXHLIeAUlbrHOXEXS6ah2glPhLDEg6Qzp/lKVSISolal7q73qyhF483P9jXn3hefSLA9J1/1LgeajWvuVkxuw+dy2Tlv7oUpNBkX47/TOho5qttr1y9K3hD5Q87RAJPdBtFdDbY8qUPxoiBsTbUWjVoEjJf2YAsLTJIIi2ZISkbD/VdrtZnS73QSJkJReOMNT9XYNGDJvwNIrRcNGFKlJcX6qq+ozGNsDkrt0ObxAD7YCTjAYQVTlbQOaTu5DbGxGDNCoMCAwEAAQ==";
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
byte[] keyBytes = Base64.getDecoder().decode(pub.getBytes("UTF-8"));
PKCS1EncodedKeySpec KeySpec = new PKCS1EncodedKeySpec(keyBytes);
RSAPublicKey publicKey = (RSAPublicKey)keyFactory.generatePublic((java.security.spec.KeySpec) KeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.ENCRYPT_MODE, publicKey);
byte[] cipherData = cipher.doFinal(text.getBytes("UTF-8"));
return cipherData;
但它亙古不變的工作.. 據說無效DER:對象不是整數
有很多在那裏的例子。你有什麼問題?如果你想把它放在一個字符串中,不要忘記用base64或者hex來編碼密文。 –
結果將基本上是隨機字節,並非所有這些字節都是有效的UTF-8編碼。如果你需要UTF-8你需要在隨機輸出上使用編碼,通常使用Base64和Hexadecimal。 – zaph