2013-12-17 15 views
7

Tôi đã được giao nhiệm vụ thay thế một hệ thống java kế thừa bằng một cái gì đó chạy PHP.Thay thế JAVA bằng PHP để mã hóa PKCS5

Tôi đang gặp khó khăn khi thay thế mật mã java bằng mã PHP.

cipherAlgorythm = "PBEWithMD5AndDES";       
cipherTransformation = "PBEWithMD5AndDES/CBC/PKCS5Padding";  
PBEParameterSpec ps = new javax.crypto.spec.PBEParameterSpec(salt, iterations); 
SecretKeyFactory kf = SecretKeyFactory.getInstance(cipherAlgorythm); 
SecretKey key = kf.generateSecret(new javax.crypto.spec.PBEKeySpec(password.toCharArray())); 
Cipher encryptCipher = Cipher.getInstance(cipherTransformation); 
encryptCipher.init(Cipher.ENCRYPT_MODE, key, ps); 
byte[] output = encryptCipher.doFinal("This is a test string".getBytes("UTF-8")); 

Có vẻ là ruột của Java

Trong PHP tôi đang làm

$hashed_key = pbkdf2('md5', $this->key, $this->salt, $this->reps , <GUESS 1>, TRUE); 
$output = mcrypt_encrypt(MCRYPT_DES, $hashed_key, "This is a test string", MCRYPT_MODE_CBC, <GUESS 2>); 

pbkdf2 là từ here.

Vì vậy <GUESS 1> là kích thước chính và <GUESS 2> là IV . Tôi đã chơi xung quanh với những điều này không có kết quả. Có ai có đề xuất cho các giá trị như vậy? Theo như tôi có thể thấy bản thân mã hóa nên được di chuyển nhưng tôi không chắc chắn về những gì đang xảy ra trong một số phương pháp Java.

Dường như java đang tạo IV ở đâu đó, nhưng tôi không hiểu cách thức hoặc địa điểm.

CÓ LIÊN QUAN

Decrypt (with PHP) a Java encryption (PBEWithMD5AndDES)

Trả lời

1

Cả hai câu trả lời hiện giúp, nhưng tôi sẽ đăng các giải pháp hoàn chỉnh ở đây.

Tôi đã không nhìn thấy nó ghi lại bất cứ nơi nào nhưng sau khi xem xét triển khai cho chương trình mã hóa này, tôi tìm thấy chìa khóa là 8 byte đầu tiên của băm mã hóa và IV là người cuối cùng 8.

public function get_key_and_iv($key, $salt, $reps) { 
    $hash = $key . $salt; 
    for ($i = 0; $i< $reps; $i++) { 
     $hash = md5($hash, TRUE); 
    } 
    return str_split($hash,8); 
    } 

dường như làm các trick. Mà thay thế pbkdf2 trong câu hỏi của tôi, phủ nhận sự cần thiết cho <GUESS 1> và đưa ra một giá trị cho <GUESS 2>

Sau đó, tôi đã bị bắt với vấn đề đệm mà James Black đã đề cập và quản lý để sửa chữa. Vì vậy, mã cuối cùng là

list($hashed_key, $iv) = get_key_and_iv($key, $salt, $reps); 
// 8 is DES block size. 
$pad = 8 - (strlen($plaintext) % 8); 
$padded_string = $plaintext . str_repeat(chr($pad), $pad); 
return mcrypt_encrypt(MCRYPT_DES, $hashed_key, $padded_string, MCRYPT_MODE_CBC, $iv); 
1

Bạn có thể muốn nhìn vào http://us3.php.net/manual/en/ref.mcrypt.php#69782, nhưng về cơ bản, ông thực hiện một giải pháp đệm DIY:

function pkcs5_pad ($text, $blocksize) 
{ 
    $pad = $blocksize - (strlen($text) % $blocksize); 
    return $text . str_repeat(chr($pad), $pad); 
} 

Đó có thể là lựa chọn tốt nhất của bạn, nhưng nếu bạn hãy xem nhận xét này, các đề xuất của anh về cách xác minh rằng mỗi bước là chính xác có thể hữu ích cho bạn.

https://stackoverflow.com/a/10201034/67566

Lý tưởng nhất là bạn nên di chuyển ra khỏi DES và từ đệm này sẽ là một vấn đề trong PHP, tại sao không nhìn thấy nếu bạn có thể thay đổi các thuật toán mã hóa để một cái gì đó ít rắc rối và an toàn hơn?

Để giúp bạn có thể hiển thị trang này: http://www.ietf.org/rfc/rfc4772.txt, ở đó nó được thể hiện rõ ràng rằng DES dễ bị tấn công bạo lực, do đó đã không được chấp nhận và được thay thế bằng AES.

1

Bạn cũng có thể sử dụng hash_pbkdf2 PHP (5.5) function thay vì sử dụng thư viện PHP PBKDF2.

Theo tài liệu PHP GUESS 1 là chiều dài của tạo có nguồn gốc chủ yếu

dài

Chiều dài của chuỗi đầu ra. Nếu raw_output là TRUE, nó tương ứng với chiều dài byte của khóa dẫn xuất, nếu raw_output là FALSE này tương ứng với gấp đôi chiều dài byte của khóa được lấy ra (như mỗi byte của khóa được trả về dưới dạng hai hexits).

Nếu 0 được thông qua, toàn bộ đầu ra của thuật toán được cung cấp được sử dụng.

Có lẽ điều này post (what is an optimal Hash size in bytes?) kết quả thú vị cho bạn.

GUESS 2 hoặc IV là một vectơ khởi tạo ngẫu nhiên được sử dụng để tạo ra một muối duy nhất để tạo băm.

Bạn có thể tạo IV với mycript_create_iv function.

Hãy nhìn vào các mẫu hoàn toàn trong PHP.net

<?php 
$password = "password"; 
$iterations = 1000; 

// Generate a random IV using mcrypt_create_iv(), 
// openssl_random_pseudo_bytes() or another suitable source of randomness 
$salt = mcrypt_create_iv(16, MCRYPT_DEV_URANDOM); 

$hash = hash_pbkdf2("sha256", $password, $salt, $iterations, 20); 
echo $hash; 
?> 
Các vấn đề liên quan