2017-01-29 1 views
1

문제는이 두 코드가 동일한 값을 반환하지만 결과가 같지 않다는 것입니다. 제공된 키와 데이터는 동일합니다.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); 
} 
+0

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

+0

@HamidYari Shift 키가 끊어 졌습니까? –

답변

1

는 IV 정수 바이트 배열의 일이고, PHP의 IV가있다 문자열이 같지 않습니다.

예 : 정수 바이트 1의 값은 0x01이고 문자 "1"의 값은 0x31입니다.

+0

예, PHP에서 mcrypt 함수가 문자열을 IV로 받아들이 기 때문입니다. 그게 무엇을 제안합니까? 나는 정말로 혼란스럽고 나는 그것에 많은 시간을 보내고있다. – HamidYari

+1

'\ x01' 등을 사용할 수 있습니다. PHP의 문서에서 찾기가 어렵습니다. 예를 들어 [string] (http://php.net/manual/en/language.types.string)에서 찾을 수 있습니다. PHP) API 문서. –