通过 BouncyCastle 从加密字符串中通过 OpenSSL 解密字符串的问题
Issues decrypting a string by OpenSSL from encrypted string by BouncyCastle
我正在使用 BouncyCastle 和 C# 通过 RSA 引擎和 public 密钥来加密字符串。
我想用OpenSSL(Linux)解密字符串,用终端解密私钥;实际上是 OpenSSL 库,但命令终端也有问题。
我通过 OpenSSL 命令创建了密钥
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
我在通过 OpenSSL 解密字符串时遇到问题,我写了一个用于加密文件的存根。
这是加密的存根
public static void CryptStringByPublicKey(string stringToCrypt)
{
var key = GetPublicKey();
var e = new Pkcs1Encoding(new RsaEngine());
e.Init(true, key);
var bytes = Encoding.ASCII.GetBytes(stringToCrypt);
var encryptedBytes = e.ProcessBlock(bytes, 0, bytes.Length);
// Which Encoding?
var stringToSave = Encoding.UTF8.GetString(encryptedBytes);
File.WriteAllText(@"C:\temp\encrypted_file", stringToSave);
}
public static RsaKeyParameters GetPublicKey()
{
const string privateKeyString = @"C:\temp\public_key.pem";
RsaKeyParameters publicKey;
using (var reader = File.OpenText(privateKeyString))
publicKey = (RsaKeyParameters)new PemReader(reader).ReadObject();
return publicKey;
}
这是 Linux 上用于解密的命令行
openssl rsautl -decrypt -in encrypted_file -out message.decrypted -inkey lora_private.pem
我期待 message.decrypted 中的解密字符串,但 openssl 响应
140251030225344:error:0406506C:rsa routines:rsa_ossl_private_decrypt:data greater than mod len:../crypto/rsa/rsa_ossl.c:399:
我试图找出编码字符数组的问题,我尝试了各种编码(UTF8、ASCII)。
有人可以帮我提点建议吗?
不能评论太新了。
如果必须以文本形式发送,请在发送前尝试使用 base64 加密。我已经反向完成了这个 (php openssl --> c#)
然后删除空格。
byte[] encryptedBytes = Convert.FromBase64String(encrypted.Replace(" ", "+"));
我忘记了我的加密字节是 base64 编码的。 OpenSSL 会很乐意为您解码您的 base64 字符串,您可以制作一个漂亮的单行代码。不要忘记 -A 选项:
openssl.exe base64 -A -d -in enc64.txt | openssl.exe pkeyutl -decrypt -inkey .\keys\privatekey.pem
我正在使用 BouncyCastle 和 C# 通过 RSA 引擎和 public 密钥来加密字符串。
我想用OpenSSL(Linux)解密字符串,用终端解密私钥;实际上是 OpenSSL 库,但命令终端也有问题。
我通过 OpenSSL 命令创建了密钥
openssl genpkey -algorithm RSA -out private_key.pem -pkeyopt rsa_keygen_bits:2048
我在通过 OpenSSL 解密字符串时遇到问题,我写了一个用于加密文件的存根。
这是加密的存根
public static void CryptStringByPublicKey(string stringToCrypt)
{
var key = GetPublicKey();
var e = new Pkcs1Encoding(new RsaEngine());
e.Init(true, key);
var bytes = Encoding.ASCII.GetBytes(stringToCrypt);
var encryptedBytes = e.ProcessBlock(bytes, 0, bytes.Length);
// Which Encoding?
var stringToSave = Encoding.UTF8.GetString(encryptedBytes);
File.WriteAllText(@"C:\temp\encrypted_file", stringToSave);
}
public static RsaKeyParameters GetPublicKey()
{
const string privateKeyString = @"C:\temp\public_key.pem";
RsaKeyParameters publicKey;
using (var reader = File.OpenText(privateKeyString))
publicKey = (RsaKeyParameters)new PemReader(reader).ReadObject();
return publicKey;
}
这是 Linux 上用于解密的命令行
openssl rsautl -decrypt -in encrypted_file -out message.decrypted -inkey lora_private.pem
我期待 message.decrypted 中的解密字符串,但 openssl 响应
140251030225344:error:0406506C:rsa routines:rsa_ossl_private_decrypt:data greater than mod len:../crypto/rsa/rsa_ossl.c:399:
我试图找出编码字符数组的问题,我尝试了各种编码(UTF8、ASCII)。
有人可以帮我提点建议吗?
不能评论太新了。
如果必须以文本形式发送,请在发送前尝试使用 base64 加密。我已经反向完成了这个 (php openssl --> c#)
然后删除空格。
byte[] encryptedBytes = Convert.FromBase64String(encrypted.Replace(" ", "+"));
我忘记了我的加密字节是 base64 编码的。 OpenSSL 会很乐意为您解码您的 base64 字符串,您可以制作一个漂亮的单行代码。不要忘记 -A 选项:
openssl.exe base64 -A -d -in enc64.txt | openssl.exe pkeyutl -decrypt -inkey .\keys\privatekey.pem