簡體   English   中英

使用AES和密碼將Java代碼覆蓋到PHP

[英]Coverting java code to php with AES and Cipher

我發現很難將一段代碼從Java轉換為php。 我在互聯網上搜索了我的Java代碼示例中編寫的每一行代碼的含義,但沒有找到任何含義。 我想了解在此特定示例中每一行的功能。

這就是我嘗試過的。

function my_aes_encrypt($key, $data) {
 if(16 !== strlen($key)) $key = hash('MD5', $key, true);
 $padding = 16 - (strlen($data) % 16);
     $data .= str_repeat(chr($padding), $padding);
     return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $data, MCRYPT_MODE_ECB, str_repeat("\0", 16)));
 }
function my_aes_decrypt($str, $key){ 
     $str = base64_decode($str);
     $str = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB);
     $block = mcrypt_get_block_size('rijndael_128', 'ecb');
     $pad = ord($str[($len = strlen($str)) - 1]);
     $len = strlen($str);
     $pad = ord($str[$len-1]);
     return substr($str, 0, strlen($str) - $pad);
}

從Java轉換為PHP

//provided key 
byte[] keyBinary = DatatypeConverter.parseBase64Binary("r/RloSflFkLj3Pq2gFmdBQ==");  
SecretKey secret = new SecretKeySpec(keyBinary, "AES");    

// encrypted string   
byte[] bytes = DatatypeConverter.parseBase64Binary("IKWpOq9rhTAz/K1ZR0znPA=="); 

// iv 
byte[] iv = DatatypeConverter.parseBase64Binary("yzXzUhr3OAt1A47g7zmYxw==");       
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding"); 
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv)); 
String msisdn = new String(cipher.doFinal(bytes), "UTF-8"); 

如果你們讓我知道用Java編寫的每一行的細節,那將是很棒的。

Java和PHP代碼的功能差異很大。 首先,Java代碼僅包含解密部分,而PHP部分包含加密和解密部分。 與Java代碼相反,在PHP- my_aes_decrypt方法中,似乎使用了不安全的ECB模式( https://crypto.stackexchange.com/questions/20941/why-shouldnt-i-use-ecb-encryption )而不是CBC模式,因此不涉及IV。 重要性不那么重要,但又有所不同,該密鑰似乎沒有經過base64編碼,因為它沒有在任何地方解碼。 此外,在PHP代碼中,已棄用的方法(例如mcrypt_encrypthttp://php.net/manual/de/function.mcrypt-encrypt.php ))或加密弱算法(例如MD5)( https://en.wikipedia.org/使用wiki / MD5 )。

如果我理解正確,則Java代碼是參考代碼,並且您需要PHP對應部分。 因此,我專注於Java代碼,而完全忽略了不同而過時的PHP代碼。

在Java代碼中,對所有base64編碼的密鑰,數據和IV進行了解碼,然后使用這些解碼后的數據對加密后的數據進行解密。

用於解密的可能的PHP對應對象可能是:

<?php
$keyBinary = base64_decode('r/RloSflFkLj3Pq2gFmdBQ==');                                 // decode base64-encoded key in a string (internally, PHP strings are byte arrays)
$bytes = base64_decode('IKWpOq9rhTAz/K1ZR0znPA==');                                     // decode base64-encoded encrypted data in a string
$iv = base64_decode('yzXzUhr3OAt1A47g7zmYxw==');                                        // decode base64-encoded IV in a string   
$msisdn = openssl_decrypt($bytes, 'AES-128-CBC', $keyBinary, OPENSSL_RAW_DATA, $iv);    // decrypt data using AES-128, CBC-mode and PKCS7-Padding (default-padding)
                                                                                        // - when OPENSSL_RAW_DATA is specified raw data are returned, otherwise base64-encoded data (= default)
                                                                                        // - when OPENSSL_ZERO_PADDING is specified no padding is used, otherwise PKCS7-padding (= default)
                                                                                        // - The value XXX in AES-XXX-CBC is determined by the length of the key in Bit used in the Java-code,
                                                                                        //   e.g. for a 32 Byte (256 Bit)-key AES-256-CBC has to be used.  
print $msisdn."\n"; // Output: 1234567                                                  // print decrypted data

可以在注釋中找到所需的Java代碼說明:

//provided key 
byte[] keyBinary = DatatypeConverter.parseBase64Binary("r/RloSflFkLj3Pq2gFmdBQ==");     // decode base64-encoded key in a byte-array
SecretKey secret = new SecretKeySpec(keyBinary, "AES");                                 // create AES-key from byte-array (currently 16 Byte = 128 Bit long) 

// encrypted string    
byte[] bytes = DatatypeConverter.parseBase64Binary("IKWpOq9rhTAz/K1ZR0znPA==");         // decode base64-encoded encrypted data in a byte-array

// iv
byte[] iv = DatatypeConverter.parseBase64Binary("yzXzUhr3OAt1A47g7zmYxw==");            // decode base64-encoded IV in a byte-array     
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");                             // create cipher-instance for using AES in CBC-mode with PKCS5-Padding (Java counterpart to PKCS7)
cipher.init(Cipher.DECRYPT_MODE, secret, new IvParameterSpec(iv));                      // initialize cipher-instance for decryption with specified AES-key and IV (the latter created from corresponding byte-array) 
String msisdn = new String(cipher.doFinal(bytes), "UTF-8");                             // decrypt data using AES-128 (128 determined by length of used key in Bit), CBC-mode and PKCS5-Padding, 
                                                                                        // and put them in a UTF-8 string
System.out.println(msisdn); // Output: 1234567                                          // print decrypted data

PHP加密部分可以是:

<?php
$keyBinary = base64_decode('r/RloSflFkLj3Pq2gFmdBQ==');                                 
$msisdn = '1234567';                                                                    // plain text
$iv = openssl_random_pseudo_bytes(16);                                                  // generate random IV
//$iv = base64_decode('yzXzUhr3OAt1A47g7zmYxw==');                                      // use this line for tests with your base64-encoded test-IV yzXzUhr3OAt1A47g7zmYxw==   
$bytes = openssl_encrypt($msisdn, 'AES-128-CBC', $keyBinary, OPENSSL_RAW_DATA, $iv);    // encrypt data using AES-128, CBC-mode and PKCS7-Padding (default-padding) 
$ivBase64 = base64_encode($iv);                                                         // base64-encode IV
$bytesBase64 = base64_encode($bytes);                                                   // base64-encode encrypted data
print $ivBase64."\n".$bytesBase64."\n";                                                 // print base64-encoded IV and encrypted data

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM