gpt4 book ai didi

java - 无法在 Android 中解密加密的短信(在 2.2 操作系统中加密)...(尝试在 2.3 操作系统中解密)

转载 作者:行者123 更新时间:2023-12-01 15:38:38 25 4
gpt4 key购买 nike

我能够加密短信并将其从一个模拟器 (Android 2.2) 发送到另一个模拟器。在接收端我能够成功解密。但问题是,如果在一个操作系统版本(即 Android 2.2)中进行加密并尝试在另一个操作系统版本(Android 2.3)中解密,我会收到“错误填充异常”。我检查了一下两端都使用了相同的 key 。代码如下所示

public class ED {


private String Key;

public ED() {
Key = "abc12"; // Assigning default key.
}

public ED(String key) {
// TODO Auto-generated constructor stub
Key = key;

}



public String encrypt(String toEncrypt) throws Exception {
byte[] rawKey = getRawKey(Key.getBytes("UTF-8"));
byte[] result = encrypt(rawKey, toEncrypt.getBytes("UTF-8"));
return toHex(result);
}



public byte[] encrypt(byte[] key, byte[] toEncodeString) throws Exception {

SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec);

byte[] encrypted = cipher.doFinal(toEncodeString);

return encrypted;
}

private byte[] getRawKey(byte[] key) throws Exception {

KeyGenerator kGen = KeyGenerator.getInstance("AES");
SecureRandom sr = SecureRandom.getInstance("SHA1PRNG");
sr.setSeed(key);
kGen.init(128, sr);
SecretKey sKey = kGen.generateKey();
byte[] raw = sKey.getEncoded();
return raw;

}

/************************************* Decription *********************************************/

public String decrypt(String encryptedString) throws Exception {

byte[] rawKey = getRawKey(Key.getBytes("UTF-8"));
System.out.println("Decrypted Key in bytes : "+rawKey);


System.out.println("Key in decryption :"+rawKey);


SecretKeySpec sKeySpec = new SecretKeySpec(rawKey, "AES");
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, sKeySpec);
byte[] decrypted = cipher.doFinal(toByte(encryptedString));
System.out.println("Decrypted mess in bytes---------->" +decrypted);
return new String(decrypted);
}






public String toHex(byte[] buf) {
if (buf == null)
return "";
StringBuffer result = new StringBuffer(2*buf.length);
for (int i = 0; i < buf.length; i++) {
appendHex(result, buf[i]);
}
return result.toString();
}
private final String HEX = "0123456789ABCDEF";
private void appendHex(StringBuffer sb, byte b) {
sb.append(HEX.charAt((b>>4)&0x0f)).append(HEX.charAt(b&0x0f));
}

public byte[] toByte(String hexString) {
int len = hexString.length()/2;
byte[] result = new byte[len];
for (int i = 0; i < len; i++)
result[i] = Integer.valueOf(hexString.substring(2*i, 2*i+2), 16).byteValue();
return result;
}

}

我正在使用 sendTextMessage() 函数发送短信。我读到加密/解密不依赖于操作系统,但在这种情况下事实并非如此。配置密码(在 AES 中)时我是否遗漏了任何重要的事情?请告诉我。

最佳答案

这是setSeed()。它不会做你认为它会做的事情:它只是将给定种子的熵添加到底层算法中。您可能会发现它在两个平台上返回不同的内容。 SHA1PRNG 一个伪随机函数,但如果它已经播种,则可能会返回不同的结果。

关于java - 无法在 Android 中解密加密的短信(在 2.2 操作系统中加密)...(尝试在 2.3 操作系统中解密),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8445760/

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