我试图在Android和PHP端使用AES加密/解密数据,并累犯空答案。
首先,我在Android中生成了对称密钥:
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;
}
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);
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);
在服务器端,我试图解密数据。我可以解密(从RSA)秘密的AES密钥,并得到它的字符串表示。在客户端(Android)和服务器端(PHP)上是一样的。但是如何使用这个字符串AES密钥来解密数据呢?我尝试了这个(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模式时,需要一个块大小(对于AES为16字节)iv(初始化向量),代码中缺少该向量。另外,Android代码中的encrypt_mode
是什么也不清楚。
问题内容: 我找到了在PHP中对字符串进行编码/解码的示例。起初它看起来非常好,但是不会起作用:-( 有人知道问题出在哪里吗? 结果是: 加密: 解密: 问题答案: 并且 在您的代码中未定义。查看有效的解决方案( 但不安全! ): 停! 这个例子是 不安全的! 不要使用它! **但是此代码中还有其他问题,使其变得不安全,尤其是使用ECB(这不是_加密_模式,只能在其上定义加密模式的构造块)。
我之所以问这个问题,是因为两天来我读了很多关于crypto AES加密的帖子,就在我以为我得到了它的时候,我意识到我根本没有得到它。 这个帖子是最接近我的问题,我有完全相同的问题,但它没有得到回答: CryptoJS AES加密与JAVA AES解密值不匹配 我得到的是已经加密的字符串(我得到的代码只是为了看看他们是怎么做的),所以修改加密方式不是一个选项。这就是为什么所有类似的问题对我来说都不是
我正在Android中进行AES加密和解密,我使用下面的Android代码片段发布请求。 申请职位 我成功地从上述请求中获得了Base64加密响应字符串,但当我尝试使用以下代码段解密响应字符串时,它会返回无法读取的字符串,如字符和方框。 解密 解密的输出 ��]ة*�]��O Z Q2_ 响应应为JSON格式,但实际输出如上所述。 请使用Base 64共享用于使用AES 256位安全密钥解密数据的
问题内容: 我迅速编写了一个应用程序,我需要AES加密和解密功能,我从另一个.Net解决方案中接收了加密数据,但是我找不到解决办法。 这是我的.net加密: 我需要迅速解密功能。 问题答案: 我找到了解决方案,它是一个很好的库。 跨平台256位AES加密/解密。 此项目包含在所有平台(C#,iOS,Android)上均可使用的256位AES加密的实现。关键目标之一是通过简单的实现使AES在所有平台
我在这个网站上用AES-256加密一个虚拟字符串: https://www.devglan.com/online-tools/aes-encryption-decryption 具有以下参数: null 当我尝试用OpenSSL从命令行解密它时: 我得到这个错误:
我的德尔福应用程序使用 TurboPower 密码箱 3 使用 AES 256 加密纯文本信息。我现在想使用PHP解密这些信息。但是涡轮增压锁盒3有一些互操作性问题。 有关详细信息,请查看LockBox 3作者的帖子: http://lock box . seanbdurkin . id . au/tiki-view _ forum _ thread . PHP?comments_parentId