문제는이 두 코드가 동일한 값을 반환하지만 결과가 같지 않다는 것입니다. 제공된 키와 데이터는 동일합니다.CES 및 PHP에서 AES 암호화 결과가 서로 다릅니다.
다음은 C#의 주 코드입니다. 결과는 다음과 JzhfuV7T8BI9NnYsFdHIDw==
public static RijndaelManaged GetCryptoTransform(string key)
{
string key_string64 = Convert.ToBase64String(Encoding.UTF8.GetBytes(key));
Console.WriteLine(key_string64);
RijndaelManaged aes = new RijndaelManaged();
aes.BlockSize = 128;
aes.KeySize = 256;
aes.Mode = CipherMode.CBC;
aes.Padding = PaddingMode.PKCS7;
byte[] keyArr = Convert.FromBase64String(key_string64);
byte[] KeyArrBytes32Value = new byte[keyArr.Length];
Array.Copy(keyArr, KeyArrBytes32Value, keyArr.Length);
byte[] ivArr = { 1, 2, 3, 4, 5, 6, 6, 5, 4, 3, 2, 1, 7, 7, 7, 7 };
byte[] IVBytes16Value = new byte[16];
Array.Copy(ivArr, IVBytes16Value, 16);
aes.Key = KeyArrBytes32Value;
aes.IV = IVBytes16Value;
return aes;
}
public static string Encrypt(string PlainText, string key)
{
var aes = GetCryptoTransform(key);
var encrypto = aes.CreateEncryptor();
byte[] plainTextByte = ASCIIEncoding.UTF8.GetBytes(PlainText);
byte[] CipherText = encrypto.TransformFinalBlock(plainTextByte, 0, plainTextByte.Length);
return Convert.ToBase64String(CipherText);
}
여기에서 PHP 코드, 결과는 다음과 C#으로 ztykbceGV0SZqh/MyBInXQ==
function aes128_cbc_encrypt($key, $data) {
$iv = "1234566543217777";
$keyString = base64_encode ($key);
$padding = 16 - (strlen ($data) % 16);
$data .= str_repeat (chr ($padding), $padding);
return mcrypt_encrypt (MCRYPT_RIJNDAEL_128, $keyString, $data, MCRYPT_MODE_CBC, $iv);
}
mcrypt를 사용하지 않는 것이 가장 좋습니다. 지금은 거의 10 년 동안 폐기 된 것입니다. 그러므로 PHP 7.2에서 비추천되었으며 PECL에서 제거 될 것입니다. 표준 PKCS # 7 (nee PKCS # 5) 패딩을 지원하지 않으며, 바이너리 데이터로도 사용할 수없는 비표준 널 패딩 만 지원합니다. mcrypt는 2003 년으로 거슬러 올라가는 많은 버그를 가지고 있습니다. [defuse] (https://github.com/defuse/php-encryption) 또는 [RNCryptor] (https://github.com/RNCryptor)를 사용하는 것을 고려해보십시오. 완전한 해결책은 유지되고 있으며 정확합니다. – zaph
@HamidYari Shift 키가 끊어 졌습니까? –