2011-06-30 117 views
0

我目前正在使用128位AES,填充PKCS7和CBC来加密字符串的Android项目。我不想为此使用任何盐。仅使用公钥加密字符串

我已经尝试过不同的变化包括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 – karl

+0

这是字节数组的'toString()'。如果你想查看内容,使用'Arrays.toString()'。 – musiKk

回答

0

[B @ 44f075b0看起来像一个对象引用。你在这里返回一个数组,确定你没有打印出数组的内存地址而不是它的内容?

0

尝试使用System.out.println("..encrypted data is.."+new String(output));

它会告诉你的加密字符串

+0

嗯,当我这样做时,我似乎得到某种编码错误: 0 cG p – karl

+0

我检查了您的代码 –

+0

我看过您的评论。 –

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; 

在现实世界中的代码,可以考虑多散列通短语。

0

据我所知,你对密码学的理解是有缺陷的。

你正在削减你的'钥匙'在16块。这是没有必要的。但是,如果您削减任何内容,则必须将明文缩减为AES-128的16字节块。

您的代码可能适用于给定的纯文本。但是,一旦你增加了明文的大小,它就会失败。

关于[@B ..部分,一旦加密,数据将默认以字节[]存储。这就是你明白的原因。转换消息发送到使用

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

相关问题