AES-Java中的加密和PHP中的解密
为什么PHP解密方法不能解密用Java加密的数据 当我只使用Java或PHP加密和解密数据时,一切都正常 我有Java类来使用AES/ECB算法加密/解密数据。加密密钥始终为2a925de8ca0248d7AES-Java中的加密和PHP中的解密,java,php,encryption,aes,Java,Php,Encryption,Aes,为什么PHP解密方法不能解密用Java加密的数据 当我只使用Java或PHP加密和解密数据时,一切都正常 我有Java类来使用AES/ECB算法加密/解密数据。加密密钥始终为2a925de8ca0248d7 package com.example.test.helpers; import android.util.Base64; import java.nio.charset.StandardCharsets; import javax.crypto.Cipher; import javax.c
package com.example.test.helpers;
import android.util.Base64;
import java.nio.charset.StandardCharsets;
import javax.crypto.Cipher;
import javax.crypto.spec.SecretKeySpec;
public class Encryptor {
/**
* @param strToEncrypt - data to encrypt
* @param secret - 16 bytes secret
*/
public static String encrypt(String strToEncrypt, String secret) // secret is always 2a925de8ca0248d7
{
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(secret.getBytes(), "AES"));
return Base64.encodeToString(cipher.doFinal(strToEncrypt.getBytes(StandardCharsets.UTF_8)), Base64.DEFAULT);
}
catch (Exception e)
{
System.out.println("Error while encrypting: " + e.toString());
}
return null;
}
/**
* @param strToDecrypt - base64 encoded string to decrypt
* @param secret - 16 bytes secret
*/
public static String decrypt(String strToDecrypt, String secret) // secret is always 2a925de8ca0248d7
{
try {
Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");
cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(secret.getBytes(), "AES"));
return new String(cipher.doFinal(Base64.decode(strToDecrypt, Base64.DEFAULT)));
}
catch (Exception e) {
System.out.println("Error while decrypting: " + e.toString());
}
return null;
}
}
加密的数据被发送到服务器,我试图用PHP openssl_decrypt对其进行解密
openssl_decrypt($receivedEncryptedBase64Data, 'AES-256-ECB', '2a925de8ca0248d7');
不幸的是,openssl_decrypt返回一个空字符串。好的,现在我明白了。
我应该在PHP中使用AES-128-ECB插入AES-256-ECB,或者将密钥扩展到256字节。Java的256位密钥在哪里?您使用的是128位密钥,但指定的是AES-256。。。而且你的代码是超级不安全的。ECB模式,无身份验证。。。从密文中检索明文可能很简单。看起来你还要用它来保护交通安全,这是个糟糕的主意。改用TLS,不要尝试自己动手。ECB只是暂时的,最终会有CBC模式。我不打算将其用于传输安全性,我只想将编码的令牌从Android应用程序发送到PHP服务器,在那里我想解码并检查令牌的正确性(最终我将使用TSL进行传输安全性)你说你不打算用它来保护交通安全,然后马上描述你自己用它保护交通安全。。。请记住,使用您当前的代码,任何可以下载您的Android应用程序的人都可以解密应用程序与您的服务器之间的流量,甚至是其他人的流量。还请记住,因为您没有任何身份验证,任何人(实际上是任何人,即使没有应用程序)都可以更改加密数据,而您将不知道。不要依赖它来获得任何形式的安全。