如何使用 java 中给定的 public 键使用 rsa/ecb/pkcs1 填充模式对文本进行编码?
How to encode a text with rsa/ecb/pkcs1 padding mode with a given public key in java?
我想在 java.[=13 中使用给定的 public 键(public 键是一个字符串)使用 rsa/ecb/pkcs1 填充模式对字符串进行编码=]
我也想以UTF-8格式呈现结果
怎么做?
假设您使用的是有效的 RSA 密钥,您将需要:
将您的 public 键从字符串转换为实际的 public 键对象
//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);
获取纯文本的字节数
- 使用您的 public 密钥加密
- 编码为可读格式。
查看第 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;
但是没用..
据说 Invalid DER: object is not integer
我想在 java.[=13 中使用给定的 public 键(public 键是一个字符串)使用 rsa/ecb/pkcs1 填充模式对字符串进行编码=]
我也想以UTF-8格式呈现结果 怎么做?
假设您使用的是有效的 RSA 密钥,您将需要:
将您的 public 键从字符串转换为实际的 public 键对象
//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);
获取纯文本的字节数
- 使用您的 public 密钥加密
- 编码为可读格式。
查看第 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;
但是没用.. 据说 Invalid DER: object is not integer