2012-02-27 10 views
1

私はこのコードをJavaで作成しています。このコードは、AES 128ビットを使用してソース文字列をBase64暗号化値に暗号化します。しかし、私は同じ結果を生成する同様のPHP関数を見つけることに失敗しました。どんな助けにも大いに感謝します。相当のAES PHPの128ビット

String key = "123456789"; 
    String source = "The quick brown fox jumped over the lazy dog"; 

    byte[] raw = key.getBytes(); 
    SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); 

    // Instantiate the cipher 
    Cipher cipher = Cipher.getInstance("AES"); 

    cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 

    byte[] encrypted = cipher.doFinal(source.getBytes()); 
    System.out.println(new String(Base64.encodeBase64(encrypted))); 
+1

'bse64decode()'と手動http://php.net/ref.mcrypt – KingCrunch

+0

を見ては、ここを見て: http://www.chilkatsoft.com/p/php_aes.asp – MByD

+0

用語が正しくありません。 「AES 128 bitを使用したBase64暗号化値」は不正確です。 「AES-128で暗号化された** ** Base64でエンコードされた**値」という正しい方法があります。 –

答えて

6

これは答えです。クレジットは、彼が

<?php 
function encrypt($str, $key){ 
    $block = mcrypt_get_block_size('rijndael_128', 'ecb'); 
    $pad = $block - (strlen($str) % $block); 
    $str .= str_repeat(chr($pad), $pad); 
    return base64_encode(mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB)); 
} 

function 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); 
} 
?> 
+1

DESのブロックサイズを取得していますが、AES暗号化を指定しています。これは間違っています。 – pawstrong

0

を述べていること@owlsteadとスレッド内のオリジナルの答えの所有者に行く私は、PHPにJavaコードを変換するわずかに異なる要件を持っていました。

Javaコード:

SecretKeySpec skeySpec = new SecretKeySpec(Hex.decodeHex(key 
      .toCharArray()), algorithm); 
Cipher cipher = Cipher.getInstance(algorithm); 
cipher.init(Cipher.ENCRYPT_MODE, skeySpec); 
byte[] encrypted = cipher.doFinal(message.getBytes());    
return new String(Hex.encodeHex(encrypted)); 

PHP相当:

$storeServerToken = 'my_token'; 
date_default_timezone_set('UTC'); 
$str = $storeServerToken . '|' . date('Y-m-d H:i:s', gmmktime()); 
$key = 'my_key'; 
return bin2hex($this->_encrypt($str, $this->_hex2bin($key))); 

private function _encrypt($str, $key) { 
    $block = mcrypt_get_block_size('rijndael_128', 'ecb'); 
    $pad = $block - (strlen($str) % $block); 
    $str .= str_repeat(chr($pad), $pad); 
    return mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $str, MCRYPT_MODE_ECB); 
} 

private function _hex2bin($hexstr) { 
    $n = strlen($hexstr); 
    $sbin = ""; 
    $i = 0; 
    while ($i < $n) { 
     $a = substr($hexstr, $i, 2); 
     $c = pack("H*", $a); 
     if ($i == 0) { 
      $sbin = $c; 
     } else { 
      $sbin.=$c; 
     } 
     $i+=2; 
    } 

    return $sbin; 
}