在我的项目中,我正在进行AES加密和Decryption.i使用此算法加密和解密字符串并将字符串存储在sq-lite数据库中。现在我从数据库中获取该加密密钥并尝试解密它但是它显示了一个异常(pad block corrupted)。我正在使用
将Encrypted字符串转换为字节 public static byte[] hexStringToByteArray(String s) {
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2) {
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4)
+ Character.digit(s.charAt(i+1), 16));}
return data;
}
并获取正确的字节但在转换为字符串时显示“pad block corrupted”。 在此先感谢。如果找到答案,真的很感激。 我的代码是
dh=new data_helper(Resy.this);
mac_db=dh.getData();
// getdata=mac_db.toString();
KeyGenerator kgen;
try {
kgen = KeyGenerator.getInstance("AES");
kgen.init(128); // 192 and 256 bits may not be available
// Generate the secret key specs.
SecretKey skey = kgen.generateKey();
byte[] raw = skey.getEncoded();
SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES");
// Instantiate the cipher
Cipher cipher = Cipher.getInstance("AES");
getdata=mac_db.toString();
// byte g1[]=getdata.getBytes();
// System.out.println(g1);
byte b[]=hexStringToByteArray(getdata);
cipher.init(Cipher.DECRYPT_MODE, skeySpec);
byte[] m1=cipher.doFinal(b); // here pad block corrupt exception came.
String originalString_mac = new String(original_macadress);
Toast.makeText(getApplicationContext(),"Original : " +originalString_mac + " " + asHex(original_macadress) , Toast.LENGTH_LONG).show();
答案 0 :(得分:2)
首先确保您的数据长度正确,并且十六进制转换中没有错误。接下来,您需要使用相同的密钥进行加密和解密。从上面的代码看起来你每次都在生成一个新密钥。这是行不通的:即使解密成功,你也会得到与原始纯文本截然不同的东西。然后Cipher cipher = Cipher.getInstance("AES");
可能会使用随机IV生成密码,您需要解密。最好指定一个显式的转换字符串,如下所示:
Cipher c = Cipher.getInstance("AES/CBC/PKCS5Padding");
简而言之,找到一个可行的样本并从那里开始。类似于this。
答案 1 :(得分:1)
您必须对其执行Base64编码才能使AES加密/解密正常工作。
按如下方式进行。
用于加密:原始字符串 - &gt; Aes加密&gt; base64编码---&gt;(加密字符串)
用于解密:加密字符串---&gt; base64 decode&gt; aes解密---&gt;原始字符串