使用 OpenSSL 密钥和 Bouncy castle 的 C# RSA 实现
C# RSA implementation with OpenSSL keys & Bouncy castle
我正在尝试使用 OpenSSL 生成的密钥对和 Bouncy Castle 在 C# 中实现字符串加密解密。
OpenSSL 授予我密钥对,我将其分为两个文件。现在我正在使用 Bouncy Castle 的 Pemreader 读取密钥并将它们更改为 AsymmetricKeyParameters。
下面的代码运行了,但解密的字符串与原始字符串不同 - 我得到了一堆 ?。
如果我打印出密钥,它们看起来就像在文本文件中一样。
有人可以指出我做错了什么吗? pemreading 程序或引擎使用似乎是原因。没有填充的 2048 位密钥的这种加密有多强?
string test = "qwerty12345";
AsymmetricKeyParameter keyparmeter = readPublicKey(public_path); // Read public key into string
/* Print the test key */
Console.WriteLine("test key = " + test);
/* Convert test to byte array */
byte[] bytes = new byte[test.Length * sizeof(char)];
System.Buffer.BlockCopy(test.ToCharArray(), 0, bytes, 0, bytes.Length);
byte[] cipheredbytes = null;
/* Initiate rsa engine */
RsaEngine e = new RsaEngine();
e.Init(true, keyparmeter); // initialize engine true, encrypting
/* Crypt! */
cipheredbytes = e.ProcessBlock(bytes, 0, bytes.Length);
// ## NOW DECRYPTION ##
/* Get the private key */
AsymmetricKeyParameter privkeyparameter = readPrivKey(privkey_path);
byte[] reversedbytes = null;
/* Initiate rsa decrypting engine */
RsaEngine d = new RsaEngine();
d.Init(false, privkeyparameter); // initialize engine false, decrypting
/* Decrypt! */
reversedbytes = d.ProcessBlock(cipheredbytes, 0, cipheredbytes.Length);
char[] chars = new char[cipheredbytes.Length / sizeof(char)];
System.Buffer.BlockCopy(cipheredbytes, 0, chars, 0, cipheredbytes.Length);
string reversedtest = new string(chars);
### PEMREADING ###
/* Convert PEM into AsymmetricKeyParameter */
private AsymmetricKeyParameter readPublicKey(string path_to_key)
{
RsaKeyParameters asmkeypar;
using(var reader = File.OpenText(path_to_key))
asmkeypar = (RsaKeyParameters) new PemReader(reader).ReadObject();
return asmkeypar;
}
/* Convert PEM into AsymmetricKeyParameter */
private AsymmetricKeyParameter readPrivKey(string path_to_key)
{
AsymmetricCipherKeyPair asmkeypar;
using (var reader = File.OpenText(path_to_key))
asmkeypar = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
return (RsaKeyParameters) asmkeypar.Private;
}
您正在使用基本 RSA 算法。这也称为原始或教科书 RSA。基本上它执行模幂运算,但不执行填充或取消填充。所以你收到的是明文 + 值前面的零,因为似乎没有发生 unpadding。
最后,你应该执行字符编码而不是System.Buffer.BlockCopy
,后者可能会把它弄得一团糟,因为它必须对Unicode编码的字符串进行操作在 .NET 中。
我可以向您推荐 this question 加密,它试图列出对 raw/textbook RSA 的所有可能攻击。有很多,您的代码安全的可能性几乎为零。
我正在尝试使用 OpenSSL 生成的密钥对和 Bouncy Castle 在 C# 中实现字符串加密解密。
OpenSSL 授予我密钥对,我将其分为两个文件。现在我正在使用 Bouncy Castle 的 Pemreader 读取密钥并将它们更改为 AsymmetricKeyParameters。
下面的代码运行了,但解密的字符串与原始字符串不同 - 我得到了一堆 ?。
如果我打印出密钥,它们看起来就像在文本文件中一样。
有人可以指出我做错了什么吗? pemreading 程序或引擎使用似乎是原因。没有填充的 2048 位密钥的这种加密有多强?
string test = "qwerty12345";
AsymmetricKeyParameter keyparmeter = readPublicKey(public_path); // Read public key into string
/* Print the test key */
Console.WriteLine("test key = " + test);
/* Convert test to byte array */
byte[] bytes = new byte[test.Length * sizeof(char)];
System.Buffer.BlockCopy(test.ToCharArray(), 0, bytes, 0, bytes.Length);
byte[] cipheredbytes = null;
/* Initiate rsa engine */
RsaEngine e = new RsaEngine();
e.Init(true, keyparmeter); // initialize engine true, encrypting
/* Crypt! */
cipheredbytes = e.ProcessBlock(bytes, 0, bytes.Length);
// ## NOW DECRYPTION ##
/* Get the private key */
AsymmetricKeyParameter privkeyparameter = readPrivKey(privkey_path);
byte[] reversedbytes = null;
/* Initiate rsa decrypting engine */
RsaEngine d = new RsaEngine();
d.Init(false, privkeyparameter); // initialize engine false, decrypting
/* Decrypt! */
reversedbytes = d.ProcessBlock(cipheredbytes, 0, cipheredbytes.Length);
char[] chars = new char[cipheredbytes.Length / sizeof(char)];
System.Buffer.BlockCopy(cipheredbytes, 0, chars, 0, cipheredbytes.Length);
string reversedtest = new string(chars);
### PEMREADING ###
/* Convert PEM into AsymmetricKeyParameter */
private AsymmetricKeyParameter readPublicKey(string path_to_key)
{
RsaKeyParameters asmkeypar;
using(var reader = File.OpenText(path_to_key))
asmkeypar = (RsaKeyParameters) new PemReader(reader).ReadObject();
return asmkeypar;
}
/* Convert PEM into AsymmetricKeyParameter */
private AsymmetricKeyParameter readPrivKey(string path_to_key)
{
AsymmetricCipherKeyPair asmkeypar;
using (var reader = File.OpenText(path_to_key))
asmkeypar = (AsymmetricCipherKeyPair)new PemReader(reader).ReadObject();
return (RsaKeyParameters) asmkeypar.Private;
}
您正在使用基本 RSA 算法。这也称为原始或教科书 RSA。基本上它执行模幂运算,但不执行填充或取消填充。所以你收到的是明文 + 值前面的零,因为似乎没有发生 unpadding。
最后,你应该执行字符编码而不是System.Buffer.BlockCopy
,后者可能会把它弄得一团糟,因为它必须对Unicode编码的字符串进行操作在 .NET 中。
我可以向您推荐 this question 加密,它试图列出对 raw/textbook RSA 的所有可能攻击。有很多,您的代码安全的可能性几乎为零。