2012-06-12 39 views
7

Tôi đã đoạn mã sau C# mà tạo ra các phím:Sự khác nhau giữa mã hóa .NET và PHP

public static byte[] Encrypt(byte[] plainData, string salt) 
    { 
     DESCryptoServiceProvider DES = new DESCryptoServiceProvider(); 
     DES.Key = ASCIIEncoding.ASCII.GetBytes(salt); 
     DES.IV = ASCIIEncoding.ASCII.GetBytes(salt); 
     ICryptoTransform desencrypt = DES.CreateEncryptor(); 
     byte[] encryptedData = desencrypt.TransformFinalBlock(plainData, 0, plainData.Length); 
     return encryptedData; 
    } 

    private string GetEncryptedKey(string key) 
    { 
     return BitConverter.ToString(KeyGeneratorForm.Encrypt(ASCIIEncoding.ASCII.GetBytes(key), "abcdefgh")).Replace("-", ""); 
    } 

Tôi đang cố gắng để thực hiện điều tương tự trong PHP:

function get_encrypted_key($key){ 
    $salt = "abcdefgh"; 
    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

Tuy nhiên, có sự khác biệt nhỏ trong kết quả, vì 16 ký tự cuối cùng luôn khác nhau:

With key "Benjamin Franklin": 
C# : 0B3C6E5DF5D747FB3C50DE952FECE3999768F35B890BC391 
PHP: 0B3C6E5DF5D747FB3C50DE952FECE3993A881F9AF348C64D 

With key "President Franklin D Roosevelt": 
C# : C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB32A86FABCEA5711E1 
PHP: C119B50A5A7F8C905A86A43F5694B4D7DD1E8D0577F1CEB37ACBE60BB1D21F3F 

Tôi cũng đã cố gắng thực hiện phần đệm chuyển sang khóa của tôi bằng cách sử dụng mã sau:

function get_encrypted_key($key){ 
    $salt = "abcdefgh"; 

    $extra = 8 - (strlen($key) % 8); 
    if($extra > 0) { 
     for($i = 0; $i < $extra; $i++) { 
      $key.= "\0"; 
     } 
    } 

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

Nhưng tôi sẽ có kết quả tương tự như không có đệm.

Nếu bạn có bất kỳ đầu mối nào về những gì đang xảy ra, tôi rất vui khi được nghe về điều đó! :)

Cảm ơn

+3

Có lẽ một kết quả của chương trình đệm khác nhau? – mensi

+2

Nếu bằng đoạn mã đệm "cổ điển", bạn có nghĩa là đoạn được đề cập ngay ở đầu ghi chú trên 'mcrypt_encrypt', cung cấp cho tôi kết quả' C# 'của bạn từ PHP. Lưu ý rằng đoạn mã sử dụng ECB chứ không phải CBC, vì vậy bạn cần phải chỉnh sửa đoạn mã đó. –

+0

Cảm ơn các bạn đã bình luận. Tôi đã viết chi tiết mã mà tôi đã sử dụng để đệm. Tôi sẽ nhìn vào liên kết của John. – karlipoppins

Trả lời

4

Bạn đã đề cập thử đoạn mã đệm "cổ điển". Sự thích ứng nhanh chóng sau đây của đoạn trích được đăng trên mcrypt_encrypt documentation cho kết quả tương tự bạn nhận được từ C#.

PKCS # 7 (sơ đồ đệm mặc định được sử dụng bởi C# 'SymmetricAlgorithm) miếng đệm có byte trong đó mỗi giá trị byte đệm giống với số byte đệm, không phải bằng 0 byte.

function get_encrypted_key($key) 
{ 
    $salt = 'abcdefgh'; 
    $block = mcrypt_get_block_size('des', 'cbc'); 
    $pad = $block - (strlen($key) % $block); 
    $key .= str_repeat(chr($pad), $pad); 

    return bin2hex(mcrypt_encrypt(MCRYPT_DES, $salt, $key, MCRYPT_MODE_CBC, $salt)); 
} 

Kiểm tra đầu ra:

php > echo get_encrypted_key('Benjamin Franklin'); 
0b3c6e5df5d747fb3c50de952fece3999768f35b890bc391 
php > echo get_encrypted_key('President Franklin D Roosevelt'); 
c119b50a5a7f8c905a86a43f5694b4d7dd1e8d0577f1ceb32a86fabcea5711e1 
+0

Cảm ơn rất nhiều John, đó là hoàn hảo – karlipoppins

Các vấn đề liên quan