最近データを暗号化するために、JavaでAES CBC 128アルゴリズムを使用しました。今私はPHPでそのアルゴリズムを再構築する必要がありますが、私はどのように考えていない、インターネット上のPHPアルゴリズムは異なる結果を返すため。多分あなたは私を助けることができます。JavaとPHPを使用したAES CBC 128ビット暗号化
これは、暗号化するためのJavaコードです:
private SecretKeySpec secretKey;
private IvParameterSpec ivSpec;
public void setKey(String myKey) {
MessageDigest sha = null;
try {
byte[] key = myKey.getBytes("UTF-8");
sha = MessageDigest.getInstance("SHA-1");
key = sha.digest(key);
key = Arrays.copyOf(key, 16);
secretKey = new SecretKeySpec(key, "AES");
byte[] iv = new String("1010101010101010").getBytes("UTF-8");
ivSpec = new IvParameterSpec(iv);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
public String encrypt(String strToEncrypt) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, secretKey, ivSpec);
return Base64.encode(cipher.doFinal(strToEncrypt.getBytes("UTF-8")));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public String decrypt(String strToDecrypt) {
try {
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
cipher.init(Cipher.DECRYPT_MODE, secretKey, ivSpec);
return new String(cipher.doFinal(Base64.decode(strToDecrypt)));
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
public static void main(String[] args) {
AESText aes = new AESText();
final String secretKey = "com.secure.test.projectjasdS/FjkGkGhkGjhG786Vjfg=tjGFGH";
aes.setKey(secretKey);
String originalString = "test set se ts et set s et se";
String encryptedString = aes.encrypt(originalString);
String decryptedString = aes.decrypt(encryptedString);
System.out.println("origin: " + originalString);
System.out.println("encrypted: " + encryptedString);
System.out.println("decrypted: " + decryptedString);
}
これは私のPHPコードです:
protected $key;
protected $method = 'AES-128-CBC';
protected $iv = '1010101010101010';
protected $option = OPENSSL_CIPHER_AES_128_CBC;
function __construct($key)
{
$this->key = $key;
}
public function encrypt($data) {
if (is_null($data)) {
return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null ";
}
$enc = openssl_encrypt($data, $this->method, $this->key, $this->option, $this->iv);
return base64_encode($enc);
}
public function decrypt($data) {
if (is_null($data)) {
return "Error " . INVALID_PARAMS_ENCRYPTIONS . ": Data is null ";
}
$data = base64_decode($data);
$dec = openssl_decrypt($data, $this->method, $this->key, $this->option, $this->iv);
return $dec;
}
私はJavaの暗号化データを暗号化すると、この結果はPHPの暗号解読に解読することはできません。
Java暗号化で同じ結果を返すPHPスクリプトを作成するのにお役に立てれますか?一見
ありがとう@Shastick。私は暗号化の初心者です。私は私のJavaコードを編集しました。 Javaで 'PKCS5Padding'を使用すると、動作しますが、' NoPadding'を使用すると、 'javax.crypto.IllegalBlockSizeException:16バイトの倍数ではない入力長です.'エラーが発生します。しかし、 'IV'を追加し、' CCS'を 'PKCS5Padding'で' ECB'に変更すると、javaとphpの間の暗号化は一致しません。私のコードを編集する手助けはできますか? –
入力の長さが16の倍数ではない場合は、例外として、exceptnendのように、埋め込みが完全に行われます。それを正しくするには、もう少しプレイしてチュートリアルを参照する必要があります。 – Shastick