- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我有一个函数可以成功读取 openssl 格式的私钥:
static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName)
{
AsymmetricCipherKeyPair keyPair;
using (var reader = File.OpenText(privateKeyFileName))
keyPair = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
return keyPair.Private;
}
并返回一个 AsymmetricKeyParameter,然后用于解密加密文本。
解密代码如下:
public static byte[] Decrypt3(byte[] data, string pemFilename)
{
string result = "";
try {
AsymmetricKeyParameter key = readPrivateKey(pemFilename);
RsaEngine e = new RsaEngine();
e.Init(false, key);
//byte[] cipheredBytes = GetBytes(encryptedMsg);
//Debug.Log (encryptedMsg);
byte[] cipheredBytes = e.ProcessBlock(data, 0, data.Length);
//result = Encoding.UTF8.GetString(cipheredBytes);
//return result;
return cipheredBytes;
} catch (Exception e) {
Debug.Log ("Exception in Decrypt3: " + e.Message);
return GetBytes(e.Message);
}
}
这些在 C# 中使用充气城堡库工作,我得到了正确的解密文本。但是,当我将它添加到 Java 时,PEMParser.readObject() 返回一个 PEMKeyPair 类型的对象而不是 AsymmetricCipherKeyPair 并且 java 抛出一个异常试图转换它。我检查了 C#,它实际上返回了 AsymmetricCipherKeyPair。
我不知道为什么 Java 的行为不同,但我希望这里有人可以帮助如何转换这个对象或读取私钥文件并成功解密。我在 C# 和 Java 代码中使用了相同的公钥文件和私钥文件,所以我认为错误不是由它们引起的。
此处供引用我如何读取私钥的 Java 版本:
public static String readPrivateKey3(String pemFilename) throws FileNotFoundException, IOException
{
AsymmetricCipherKeyPair keyParam = null;
AsymmetricKeyParameter keyPair = null;
PEMKeyPair kp = null;
//PrivateKeyInfo pi = null;
try {
//var fileStream = System.IO.File.OpenText(pemFilename);
String absolutePath = "";
absolutePath = Encryption.class.getProtectionDomain().getCodeSource().getLocation().getPath();
absolutePath = absolutePath.substring(0, (absolutePath.lastIndexOf("/")+1));
String filePath = "";
filePath = absolutePath + pemFilename;
File f = new File(filePath);
//return filePath;
FileReader fileReader = new FileReader(f);
PEMParser r = new PEMParser(fileReader);
keyParam = (AsymmetricCipherKeyPair) r.readObject();
return keyParam.toString();
}
catch (Exception e) {
return "hello: " + e.getMessage() + e.getLocalizedMessage() + e.toString();
//return e.toString();
//return pi;
}
}
最佳答案
Java 代码已更新为新的 API,该 API 尚未移植到 C#。您可以尝试等效的(但现在已弃用)Java PEMReader 类。它会返回一个 JCE key 对(改变的部分原因是因为原始版本只适用于 JCE 类型,而不适用于 BC 轻量级类)。
如果使用 PEMParser,你得到一个 PEMKeyPair,你可以使用 org.bouncycaSTLe.openssl.jcajce.JcaPEMKeyConverter.getKeyPair 从它得到一个 JCE KeyPair。理想情况下会有一个 BCPEMKeyConverter,但它似乎还没有被写入。无论如何,制作 AsymmetricCipherKeyPair 应该很容易:
PEMKeyPair kp = ...;
AsymmetricKeyParameter privKey = PrivateKeyFactory.createKey(kp.getPrivateKeyInfo());
AsymmetricKeyParameter pubKey = PublicKeyFactory.createKey(kp.getPublicKeyInfo());
new AsymmetricCipherKeyPair(pubKey, privKey);
这些工厂类在 org.bouncycaSTLe.crypto.util 包中。
关于java - RSA - bouncycaSTLe PEMReader 返回 PEMKeyPair 而不是 AsymmetricCipherKeyPair 用于读取私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15823094/
我正在使用 Bouncy Castle 在平台上生成 key 对包。 SecureRandom random = new SecureRandom(); ECKeyPairGenerator pGen
我有一个函数可以成功读取 openssl 格式的私钥: static AsymmetricKeyParameter readPrivateKey(string privateKeyFileName)
我是一名优秀的程序员,十分优秀!