我正在开发一个Android项目,我需要使用128位AES加密字符串,填充PKCS7和CBC。我不想为此使用任何盐。
我尝试了很多不同的变体,包括PBEKey,但我无法想出工作代码。这就是我目前所拥有的:
String plainText = "24124124123";
String pwd = "BobsPublicPassword";
byte[] key = pwd.getBytes();
key = cutArray(key, 16);
byte[] input = plainText.getBytes();
byte[] output = null;
SecretKeySpec keySpec = null;
keySpec = new SecretKeySpec(key, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding");
cipher.init(Cipher.ENCRYPT_MODE, keySpec);
output = cipher.doFinal(input);
private static byte[] cutArray(byte[] arr, int length){
byte[] resultArr = new byte[length];
for(int i = 0; i < length; i++ ){
resultArr[i] = arr[i];
}
return resultArr;
}
任何帮助表示赞赏
答案 0 :(得分:0)
[B @ 44f075b0看起来像一个对象引用。你在这里返回一个数组,确定你没有打印出数组的内存地址而不是它的内容?
答案 1 :(得分:0)
尝试使用System.out.println("..encrypted data is.."+new String(output));
它会显示加密的字符串
答案 2 :(得分:0)
考虑散列密码短语:
// hash pass one
byte[] inDigest;
MessageDigest digester= MessageDigest.getInstance("SHA-256"); // returns 256bits/ 32 bytes
byte[] message= password.getBytes("UTF8");
digester.update(message); // append message
inDigest= digester.digest(); // no salt
byte[] outDigest= new byte[lengthKey];
for (int i=0; i<lengthKey; i++){ // truncate bytes
outDigest[i]= inDigest[i];
}
return outDigest;
在真实世界的代码中,请考虑多次散列密码短语。
答案 3 :(得分:0)
据我所知,您对密码学的理解存在缺陷。
你正在以16块为单位削减'KEY'。没有必要。但是,如果你削减了任何东西,你必须将明文切换为16字节的AES-128块。
您的代码可能适用于给定的纯文本。但是,一旦增加明文的大小,它就会失败。
关于[@B ..部分,一旦加密,数据默认为byte []。这就是你得到它的原因。使用
将消息转换为十六进制格式http://forums.xkcd.com/viewtopic.php?f=11&t=16666
这将使加密的消息保持人类可读的形式,可以在模拟器上显示。
要解密,首先从十六进制转换为字节数组,然后解密。
您可以使用以下链接
1- http://www.androidsnippets.com/encryptdecrypt-strings
2- http://java.sun.com/developer/technicalArticles/Security/AES/AES_v1.html