【发布时间】:2015-03-16 21:19:45
【问题描述】:
我正在尝试使用 C# 中的 RSA 加密 AES 密钥和 IV,并使用 phpseclib 使用 PHP 解密它们。我试图解决这个问题大约 4 小时,但我总是收到“第 2495 行的解密错误”。 PKCS 好像有问题。
临时私钥
<?php define("RSA_Private", "-----BEGIN RSA PRIVATE KEY----- MIICWwIBAAKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP9wTdAh+f0Ndi55R4qBcrAIUv 1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET/DiwwTP/+YPEJYenU2Zbfirb 2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8auNNzp22QVIH19tDlwIDAQAB AoGAV62wD84pZW8YjYHiK9v3GHYCtqOKuY41z2tOwXGU61u/dNxCO9U4Xyrs1d57 zokPXFImO7y/tupmLVQuy4N8rgO0BqB2t3YETpOlwmOF4CYl0Lkoa5mlQ1XvBXoU qbNU33UlJUNheLT0UM7lhwwnBTqNlfC1/bNXL8TYCsyt+KECQQDstdKRaip8YH20 DgB2301/91pCTAkw/vXEPi8GBVq4EN/hWSwpz+hDrJrbmSBnTkQ2IlWvYy3nghGB g/QwTaZ/AkEAzriR/Snqfif2fpSovp0ln8/A0AR0utq1FfvYWMkT9woqPR5iJjS7 ZcVX1U9ayC4fPypMz/BXafy9MGstllhG6QJAakZ387GmwZDQ3zYqHzTCpuF3NKzO s6DE1wbUNe/RezKYUaSnn14o+blVDaMCWV9aYLOppMTypy5Ojcegqs8yIQJADXjL 0tLbfFNAZilsAdgd7pdMeoH/1XmRWZhrFgYsrenUrN0BCnpfSBefTMB6KxeOY8Bu 9xIzsC2PasthUi34mQJAV5IvcjaOiMSed28LegOHTBXP5Qpu96GQGneD3x92AtM+ aRhEjMeoadetA0JQcPRJgVXTov5wir5xeCEUjpplGg== -----END RSA PRIVATE KEY-----");?>
临时公钥
<?php define("RSA_Public", "-----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC/JPkdbqnnCTsfEbFlx/3bj+RP 9wTdAh+f0Ndi55R4qBcrAIUv1jTedYRkciAHIGSZgB2McymAuYzUtYW+22arD/ET /DiwwTP/+YPEJYenU2Zbfirb2bO6yXzfTf9cpctWxx4k6MeVDXIQsZv5sUiFvSl8 auNNzp22QVIH19tDlwIDAQAB -----END PUBLIC KEY-----");?>
在 C# 中 RSA 加密后的密文(decrypted = "testkey" 因为我删除了 aes 加密进行测试)
Cd/RsiVqKnEP2T9oTgnvRuHVKY09VfynLHIlinIGtW4PFrB2kKffIrIqRQKhob6bPIR4efjxhCn43AQ2gE5P/AMG/EDWk9HMJF8XuhdtsWfPmnqxVV4crpA2FZwh4BWdXq4N70ieWbuk+pRJ1dHGhLgFfphp4sVVopn3bPKw2VKI0O+MT4nUCHFac25owoFnMULzuxj60I9Qa/TIlCKwMNcv2r7ili/LvplPZIEnH2p/bR62TAUvty0yo9NTHZm+wlqyIUmA1/GrM0VHjmcnRjFQHp1zQreRspvRsbk=
PHP(strrev 与否都不变):
public function RSADecryption($key, $iv) {
$PrivateKeyFile = RSA_Private;
$rsa = new Crypt_RSA();
$rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
$rsa->loadKey($PrivateKeyFile);
// decrypt key and iv for aes decryption
$aes_key = base64_encode($rsa->decrypt(strrev((base64_decode($key)))));
$aes_iv = base64_encode($rsa->decrypt(base64_decode($iv)));
echo $aes_key;
echo "<br />";
echo $aes_iv;
}
C# 加密:
public static string RSAEncryption(string aes_key, string aes_iv, string publickey)
{
if (publickey.Contains("-----"))
{
// Get public key without -----....
publickey = publickey.Split(new string[] { "-----" }, StringSplitOptions.RemoveEmptyEntries)[1];
}
// Remove "new line" characters
publickey.Replace("\n", "");
byte[] KeyToEncrypt = Encoding.Default.GetBytes(aes_key);
byte[] IVToEncrypt = Encoding.Default.GetBytes(aes_iv);
byte[] PublicKey = Encoding.Default.GetBytes(publickey);
//Values to store encrypted symmetric keys.
byte[] EncryptedKey;
byte[] EncryptedIV;
//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Get an instance of RSAParameters from ExportParameters function.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = PublicKey;
//Import key parameters into RSA.
RSA.ImportParameters(RSAKeyInfo);
//Encrypt the symmetric key and IV.
EncryptedKey = RSA.Encrypt(KeyToEncrypt, false);
EncryptedIV = RSA.Encrypt(IVToEncrypt, false);
System.IO.File.WriteAllText(@"C:\WriteTextCryptKey.txt", Convert.ToBase64String(EncryptedKey));
System.IO.File.WriteAllText(@"C:\WriteTextCryptIV.txt", Convert.ToBase64String(EncryptedIV));
return Convert.ToBase64String(EncryptedKey);
}
函数在 phpseclib 中被调用:
function _rsaes_pkcs1_v1_5_decrypt($c)
{
// Length checking
if (strlen($c) != $this->k) { // or if k < 11
user_error('Decryption error');
return false;
}
// RSA decryption
$c = $this->_os2ip($c);
$m = $this->_rsadp($c);
if ($m === false) {
user_error('Decryption error');
return false;
}
$em = $this->_i2osp($m, $this->k);
// EME-PKCS1-v1_5 decoding
if (ord($em[0]) != 0 || ord($em[1]) > 2) {
user_error('Decryption error');
return false;
}
$ps = substr($em, 2, strpos($em, chr(0), 2) - 2);
$m = substr($em, strlen($ps) + 3);
if (strlen($ps) < 8) {
user_error('Decryption error');
return false;
}
// Output M
return $m;
}
if (ord($em[0]) != 0 || ord($em[1]) > 2) 是第 2495 行
【问题讨论】:
-
尝试评论 $rsa->setEncryptionMode(CRYPT_RSA_ENCRYPTION_PKCS1);
-
我以前试过。错误消息没有变化。
-
我不认为您可以发布完整的私钥副本来重现问题以及您无法使用该密钥解密的密文?这将更容易重现问题并从那里进行诊断。
-
没问题。我刚刚创建了一对新的用于测试。您可以在我的问题开始时获得您所要求的所有内容。
-
我认为您的私钥无效。我删除了
-----BEGIN RSA PRIVATE KEY-----并从RSA_Private中执行-----END RSA PRIVATE KEY-----并执行base64_decode(substr(RSA_Private, 0, 1186))并且有效但base64_decode(RSA_Private)无效-它返回bool(false)。
标签: c# php encryption cryptography phpseclib