2011-06-30 164 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

相關問題