2011-10-14 99 views
4

我正在製作一個簡單的程序,它需要在文本框中輸入文本,並在另一個文本框中輸入密碼,然後對其執行某種簡單加密並將其保存到文件中。之後,用戶應該能夠再次打開文件並提供用於加密的密碼,並且應該將原始文本吐出。如何使用另一個字符串作爲密碼來加密/解密字符串?

現在我正在接受字符串。將其分隔成一個char數組,然後對密碼進行相同操作。之後,我將密碼,將所有這些字符轉換爲整數,找到所有這些字符的平均值,並將其用作字符在原始文本中的偏移量。有點像:

textChars[1]= (char)((int)textChars[1]+offset); 

然後,我可以爲加密的字符串做相反:

encryptedChars[1]= (char)((int)encryptedChars[1]-offset); 

的問題是,人物有不同平臺上不同的值,所以有時偏移將會把焦炭引入一些瘋狂的數字(如負值),這將只是把字符變成問號。

我查看了標準Java API中的加密庫,但是我對每次啓動程序時隨機生成的密鑰如何工作感到困惑。

我需要的是一個看起來像String encrypt(String text,String Password)它吐出來與密碼作爲密鑰來解密加密過的文本,String decrypt(String encryptedText, String Password)這將吐出的原文(或胡言亂語如果密碼是垃圾)兩種功能

任何幫助真的很感激,這實際上只是一個個人項目,所以我不需要任何奇特的加密方法。

+0

哦是的MD5是一種方式,我不能塞滿閱讀整個帖子:) – Shahzeb

+0

可能重複[Java 256位AES加密](http:// stackoverflow。com/questions/992019/java-256bit-aes-encryption) –

回答

4

你真正需要的是對稱密碼,即該算法使用相同的密鑰來加密和解密數據。有許多算法可以支持對稱密碼學,如DES,AES。

有一個看看這個例子:http://www.java2s.com/Code/Java/Security/EncryptionanddecryptionwithAESECBPKCS7Padding.htm

在上面的例子中,更換

byte[] keyBytes = new byte[] { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 
    0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17 }; 

byte[] keyBytes = yourPassword.getBytes(); 

它使用BouncyCastle的圖書館,這無疑是最好的加密庫可用。

+1

+1對於bouncycastle和-1對於java2s :) – Shahzeb

+0

這似乎是迄今爲止最有前途的解決方案,我會試試看。 – RangerMauve

+0

@Shahzeb java2s怎麼了?我個人發現在該網站的例子是一個好的開始,而不是從頭開始。 – Manish

10

你正試圖重新發明車輪。除非你是爲了好玩而做的,否則我會推薦使用類似AES的東西。如果你只是谷歌「在Java中的AES」,你會發現一些例子。

如果你是爲了好玩而想要實現一些簡單的東西,那麼也可以看看ROT13

以下是一個Java的AES的例子:

private static final String ALGORITHM = "AES"; 
private static final byte[] keyValue = 
    new byte[] { 'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y' }; 

public String encrypt(String valueToEnc) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.ENCRYPT_MODE, key); 
    byte[] encValue = c.doFinal(valueToEnc.getBytes()); 
    String encryptedValue = new BASE64Encoder().encode(encValue); 
    return encryptedValue; 
} 

public String decrypt(String encryptedValue) throws Exception { 
    Key key = generateKey(); 
    Cipher c = Cipher.getInstance(ALGORITHM); 
    c.init(Cipher.DECRYPT_MODE, key); 
    byte[] decordedValue = new BASE64Decoder().decodeBuffer(encryptedValue); 
    byte[] decValue = c.doFinal(decordedValue); 
    String decryptedValue = new String(decValue); 
    return decryptedValue; 
} 

private static Key generateKey() throws Exception { 
    Key key = new SecretKeySpec(keyValue, ALGORITHM); 
    return key; 
} 

你可能想提高這個代碼。

+1

好的,我已經使用了您提供的代碼,但轉而使用DES,因爲我不知道AES需要多少個字符,我真的不關心強大的保護。謝謝您的幫助! – RangerMauve

+0

大多數加密算法在字節上工作,而不是字符和字符串。按照AES規範,密鑰應該是128,192或256位。要使用字符串作爲關鍵字,請查看:http://stackoverflow.com/questions/3451670/java-aes-and-using-my-own-key – Akshay