gpt4 book ai didi

php - AES加密 Android/AES解密 PHP

转载 作者:行者123 更新时间:2023-11-30 01:18:39 24 4
gpt4 key购买 nike

我正在尝试在 Android 和 PHP 端使用 AES 加密/解密数据并收到空答案。

首先,我在Android中生成了对称 key :

public static  SecretKeySpec generateSymmetric() {

// Set up secret key spec for 128-bit AES encryption and decryption
SecretKeySpec sks = null;
try {
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed("any data used as random seed".getBytes());
KeyGenerator kg = KeyGenerator.getInstance("AES");
kg.init(128, sr);
sks = new SecretKeySpec((kg.generateKey()).getEncoded(), "AES");

System.out.println("AES KEY: " + sks);
} catch (Exception e) {
Log.e(TAG, "AES secret key spec error");
}
return sks;
}

然后我将 SecretKeySpec 转换为 Base64 字符串格式:

public static String ConvertSymmetricKeyToString(SecretKeySpec key) {

String symmetric_key = null;

symmetric_key = Base64.encodeToString(key.getEncoded(), Base64.DEFAULT);
return symmetric_key;
}

调用函数:

    SecretKeySpec symmKey = generateSymmetric();


newSymmetricKeyString = CreateEncryptedXml.ConvertSymmetricKeyToString(symmKey);

然后我使用 SecretKeySpec 加密数据:

    private static String encryptDataWithSymmetricKey (SecretKeySpec symmKey, String data) throws IOException, NoSuchAlgorithmException, InvalidKeySpecException {


// encryption
byte[] toBeCiphred = data.getBytes("UTF-8");
String encryptedData = null;

try {
Cipher c = Cipher.getInstance("AES");
c.init(Cipher.ENCRYPT_MODE, symmKey);
byte[] encodedBytes = c.doFinal(toBeCiphred);
System.out.println("BYTE STRING (ASYMM): " + encodedBytes);
encryptedData = Base64.encodeToString(encodedBytes, Base64.DEFAULT);

} catch (Exception e) {
Log.e(TAG, "AES encryption error");
throw new RuntimeException(e);
}


return encryptedData;
}
encryptedData = encryptDataWithSymmetricKey(symmKey, text);

然后我在 XML 中打包字符串 secret AES key 和加密数据(使用此 AES key 加密)并使用 okhttp 向 php 服务器发出 POST 请求。字符串 key 使用 RSA 加密。

在服务器端,我尝试解密数据。我可以解密(从 RSA) secret AES key 并获得它的字符串表示形式。在客户端(Android)和服务器端(PHP)是一样的。但是我如何使用这个字符串 AES key 解密数据呢?我试过这个(PHP):

   $encryptionMethod = "AES-128-CBC";  

//$decryptedAESKey is an Android AES SecretKeySpec converted to string
//in Android the string key was base64_encoded, so i decode it
$secretHash = base64_decode($decryptedAESKey);


// Decrypt
$decryptedMessage = openssl_decrypt(base64_decode($encryptedData), $encryptionMethod, $secretHash);

//Result
echo "Encrypted: $encryptedData ";
echo " Decrypted: $decryptedMessage";

php 中的结果:

Encrypted:      s/00eZdv6sMq1hIgPUMMknb1w8d03t+R5KHn5FkHqhNJyDlBZlbm8t+t4RWh9tg/7LD9R2VbihGG
Boz9ydMEszYGgTanE2TII+OOSFZIYgCU7ekKkRLax+F2yoMvSB52LDxQ9b9ZOTxy0Zn+hH6jbVdl
HVffbk+DJTJ1PVgeRfTaG4yC6cmXh5oFx7vDxM2u+8FWc3rNTt9zKUiu0FGLn3pWpA4wyCZfoCnA
rSJWrtaPLWxPEqipJCafTc1wRof9PqkDmIQJLOr84FpsnhH0JqjwXRmyDp5K8jKe+UzvE/B1B5Sj
QiTgK1Z2wPXzQClXimX2U9AQYc33FsYQMATHNw==
Decrypted:

怎么了?

最佳答案

当使用 CBC 模式时,代码中缺少 block 大小(AES 为 16 字节)iv(初始化向量)是必需的。也不清楚 Android 代码中的 ENCRYPT_MODE 是什么。

关于php - AES加密 Android/AES解密 PHP,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37435895/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com