VB.NET与PHP之间RSA的互操作性
我使用OpenSSL和PHP生成PEM格式的公钥/私钥 在PHP中,我创建公钥/私钥:VB.NET与PHP之间RSA的互操作性,php,vb.net,encryption,openssl,rsa,Php,Vb.net,Encryption,Openssl,Rsa,我使用OpenSSL和PHP生成PEM格式的公钥/私钥 在PHP中,我创建公钥/私钥: // generate a 1024 bit rsa private key $privateKey = openssl_pkey_new(array( 'private_key_bits' => 1024, 'private_key_type' => OPENSSL_KEYTYPE_RSA, )); // Save Private key openssl_pkey_export_
// generate a 1024 bit rsa private key
$privateKey = openssl_pkey_new(array(
'private_key_bits' => 1024,
'private_key_type' => OPENSSL_KEYTYPE_RSA,
));
// Save Private key
openssl_pkey_export_to_file($privateKey, 'privateKey');
// get the public key
$keyDetails = openssl_pkey_get_details($privateKey);
// Save Public key
file_put_contents('publicKey', $keyDetails['key']);
在VB.NET中,我编写了以下代码:
'Public Key
Dim sReader As String ="MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxYT5RaHelEBmk4Z7ppiVaPPBns/36sdY12F/AXETJVl2SYkjc672JMz ..... zQwIDAQAB"
Dim PublicKey As Byte() = Encoding.UTF8.GetBytes(sReader)
Dim Exponent As Byte() = {1, 0, 1}
'Create a new instance of RSACryptoServiceProvider.
Dim RSA As New RSACryptoServiceProvider()
'Create a new instance of RSAParameters.
Dim RSAKeyInfo As New RSAParameters()
'Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = PublicKey
RSAKeyInfo.Exponent = Exponent
'Import key parameters into RSA.
RSA.ImportParameters(RSAKeyInfo)
'Create a UnicodeEncoder to convert between byte array and string.
Dim ByteConverter2 As New UnicodeEncoding()
'Create byte arrays to hold original, encrypted, and decrypted data.
bytPlainText = Encoding.UTF8.GetBytes("Data to Encrypt")
bytCipherText = RSA.Encrypt(bytPlainText, False)
Dim sEncrypt99 As String = Convert.ToBase64String(bytCipherText)
但是我不能用私钥在PHP中解密“sEncrypt99”
对于测试,我在“$encryptedData1”中复制了“sEncrypt99”
无错误,$sensitiveData2为空。奇怪。。。。
问题在哪里
雷:请原谅我英语不好,我是法国人;) 我会检查公钥的openssl版本和.NET版本之间的模数和指数是否匹配 对于1024位密钥,rsapartameters.module数组需要正好为128字节。DER字节可能有一个前导零字节,使其成为129字节——请确保不包括该字节。该.NET数组必须正好是128字节(对于1024位密钥) 我将从openssl转储公钥,并检查数组。例如:
3:d=1 hl=2 l=13 cons:序列
5:d=2 hl=2 l=9原始:对象:RSA加密 16:d=2 hl=2 l=0初始值:空值
18:d=1 hl=3 l=141原始:位字符串
0:d=0 hl=3 l= 137 cons: SEQUENCE
3:d=1 hl=3 l= 129 prim: INTEGER :B404886A7F0544C14AAE14EEE531A2D78122C9BFDB06E8C80433559A617FD159A05F8FD45500BBA63A1D07239C26BD8D32D3550D5DEAF7BF9C16D3E16BDE5A9BB56C378CB9E0E7DA9D3A5513482D74E1FDCCAC147D0E909D1B620598F710B437D50DE8F80D5F742B6DA6E2D2ED1BBEBF89A40546103A8451B59D8190633ACFA5
135:d=1 hl=2 l= 3 prim: INTEGER :010001
那个阵列,从B4 04 88开始。。。(即,您看到的密钥值)应与您在参数中设置的字节数组相匹配。我很确定这个顺序(即顺序)是你在RSACryptServiceProvider模数数组中找到的(即[0]=0xb4,[1]=0x04,等等)。此外,你可以验证指数(上面显示的第二个整数是01 00 01)。我知道这个线程有点过时,但我正在尝试完全相同的事情。我遇到了一个关于'的问题file://privateKey'. 废弃它并使用fopen,或者将密钥存储在变量中。为我工作:)
0:d=0 hl=3 l= 137 cons: SEQUENCE
3:d=1 hl=3 l= 129 prim: INTEGER :B404886A7F0544C14AAE14EEE531A2D78122C9BFDB06E8C80433559A617FD159A05F8FD45500BBA63A1D07239C26BD8D32D3550D5DEAF7BF9C16D3E16BDE5A9BB56C378CB9E0E7DA9D3A5513482D74E1FDCCAC147D0E909D1B620598F710B437D50DE8F80D5F742B6DA6E2D2ED1BBEBF89A40546103A8451B59D8190633ACFA5
135:d=1 hl=2 l= 3 prim: INTEGER :010001