- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我对 RSA 比较陌生,并且使用 BC 从公钥中获取SubjectPublicKeyInfo。
String key = "-----BEGIN RSA PUBLIC KEY-----\n" +
"........\n" +// Multiple lines here
"-----END RSA PUBLIC KEY-----\n";
Security.addProvider(new BouncyCastleProvider());
PEMParser reader = new PEMParser(new StringReader(key));
SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) reader.readObject();
然后我想要加密数据。我发现有人使用 RSAEngine 来做到这一点:
AsymmetricKeyParameter aKey = (RSAKeyParameters) PublicKeyFactory.createKey(subjectPublicKeyInfo);
AsymmetricBlockCipher engine = new RSAEngine();
engine.init(false, aKey);
byte[] dataEncrypted = engine.processBlock(data, 0, data.length);
运行这些代码后,我发现结果与预期不符。 所以我想知道我的代码是否有错误?
最佳答案
我终于找到了出路。
如果有人熟悉 BouncyCaSTLe
,他可以指出我的低级错误。
首先,要加密数据,应在 init
函数中首先将 Engine
参数设置为 true。
其次,我的公钥以“-----BEGIN RSA PUBLIC KEY-----”开头。它是 PKCS#1 格式的 RSA 公钥,应使用 BouncyCaSTLe
读入,但加密数据应具有 padding
。因此,我不应该直接使用 RSAEngine
,而是使用 PKCS1Encoding
。
最后贴出我的加密代码和解密代码:
加密:
Security.addProvider(new BouncyCastleProvider());
PEMParser reader = new PEMParser(new StringReader(key));
SubjectPublicKeyInfo subjectPublicKeyInfo = (SubjectPublicKeyInfo) reader.readObject();
RSAKeyParameters rsaKeyParameters = (RSAKeyParameters)
PublicKeyFactory.createKey(subjectPublicKeyInfo);
PKCS1Encoding engine = new PKCS1Encoding(new RSAEngine());
engine.init(true, rsaKeyParameters);
return engine.processBlock(data, 0, data.length);
解密:
public static byte[] decryptByPublicKey(String data, String key) throws Exception {
byte[] rawData = Base64.decode(data);
Security.addProvider(new BouncyCastleProvider());
PEMParser reader = new PEMParser(new StringReader(key));
PEMKeyPair pemKeyPair = (PEMKeyPair) reader.readObject();
SubjectPublicKeyInfo publicKeyInfo = pemKeyPair.getPublicKeyInfo();
PrivateKeyInfo privateKeyInfo = pemKeyPair.getPrivateKeyInfo();
RSAKeyParameters rsaKeyParameters = (RSAKeyParameters)
PrivateKeyFactory.createKey(privateKeyInfo);
PKCS1Encoding engine = new PKCS1Encoding(new RSAEngine());
engine.init(false, rsaKeyParameters);
return engine.processBlock(rawData, 0, rawData.length);
}
对于加密,您可以使用模数和公共(public)指数来创建 JDK 支持的 key :
Security.addProvider(new BouncyCastleProvider());
PEMParser reader = new PEMParser(new StringReader(key));
PemObject obj = reader.readPemObject();
org.bouncycastle.asn1.pkcs.RSAPublicKey rsaPublicKey = org.bouncycastle.asn1.pkcs.RSAPublicKey.getInstance(obj.getContent());
BigInteger modulus = rsaPublicKey.getModulus();
BigInteger publicExponent = rsaPublicKey.getPublicExponent();
KeyFactory keyFactory = KeyFactory.getInstance("RSA", "BC");
RSAPublicKeySpec pubKeySpec = new RSAPublicKeySpec(modulus, publicExponent);
PublicKey pubKey = keyFactory.generatePublic(pubKeySpec);
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding", "BC");//This line should use right padding.For PKCS#1 format RSA key , it should be this.
cipher.init(Cipher.ENCRYPT_MODE, pubKey);
return cipher.doFinal(data);
另请参阅:Basic RSA example.
关于java - 如何使用SubjectPublicKeyInfo加密数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27517883/
我获取了一个开源代码,并尝试在我的项目中使用它,但出现此错误:X509Generator 类型的方法SubjectKeyIdentifier(SubjectPublicKeyInfo) 未定义。我的代
我正在努力通过使用 ECDSA 实现 DTLS 1.2 握手来取得成功,但我在使用客户端证书时遇到了问题。当我生成它时,subjectPublicKeyInfo 似乎不正确:在 wireshark 中
尝试使用我的应用传输肥皂请求时,我收到 NoClassDefFoundError。 我读到,NoClassDefFoundError 通常可能是由初始化相关类的异常引起的,但我查看了日志,这是应用程序
N Developer Preview 中有关其网络安全配置的文档提供了以下说明: Certificate pinning is done by providing a set of certific
我正在构建一个 oauth 1.0a 服务,它将被 Jira 中的一个小工具使用,它是一个用 C# 编写的 .Net 3.5 应用程序。 Jira 使用 RSA-SHA1 签名方法向此服务发出请求,这
我是一名优秀的程序员,十分优秀!