我試着按照SO上的一個例子來加密和解密一個字符串。加密和解密一個字符串
這是我到目前爲止有:
public static String encrypt(String value) {
byte[] encrypted = null;
String encrypted_string = null;
try {
byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
Key skeySpec = new SecretKeySpec(raw, "AES");
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
byte[] iv = new byte[cipher.getBlockSize()];
IvParameterSpec ivParams = new IvParameterSpec(iv);
cipher.init(Cipher.ENCRYPT_MODE, skeySpec,ivParams);
encrypted = cipher.doFinal(value.getBytes());
System.out.println("encrypted string:" + encrypted.length);
//Encrypted byte array
System.out.println("encrypted byte array:" + encrypted);
//Encrypted string
encrypted_string = new String(encrypted);
System.out.println("encrypted string: " + encrypted_string);
} catch (Exception ex) {
ex.printStackTrace();
}
return encrypted_string;
}
public static String decrypt(String encrypted_string) {
byte[] original = null;
Cipher cipher = null;
String decrypted_string = null;
try {
byte[] raw = new byte[]{'T', 'h', 'i', 's', 'I', 's', 'A', 'S', 'e', 'c', 'r', 'e', 't', 'K', 'e', 'y'};
Key key = new SecretKeySpec(raw, "AES");
cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");
//the block size (in bytes), or 0 if the underlying algorithm is not a block cipher
byte[] ivByte = new byte[cipher.getBlockSize()];
//This class specifies an initialization vector (IV). Examples which use
//IVs are ciphers in feedback mode, e.g., DES in CBC mode and RSA ciphers with OAEP encoding operation.
IvParameterSpec ivParamsSpec = new IvParameterSpec(ivByte);
cipher.init(Cipher.DECRYPT_MODE, key, ivParamsSpec);
original= cipher.doFinal(encrypted_string.getBytes());
//Converts byte array to String
decrypted_string = new String(original);
System.out.println("Text Decrypted : " + decrypted_string);
} catch (Exception ex) {
ex.printStackTrace();
}
return decrypted_string;
}
我希望能夠加密字符串,然後返回一個加密的字符串。然後採取該加密的字符串,並將其傳遞給我的解密方法,該方法也會返回原始解密的字符串。
我跟着一個使用Byte []數組的例子,但我不想使用Byte數組,我只想使用字符串。
的問題與上述是我在這條線得到一個錯誤:
original= cipher.doFinal(encrypted_string.getBytes());
它說,「錯最後塊長度:IllegalBlockSizeException」。這讓我想我不能簡單地將我的字符串轉換爲一個字節數組並將其傳遞給final()方法。但是,我能做些什麼來以上面我想要的格式解決這個問題?
幾乎所有的加密算法要對字節,而不是字符串的工作。接受你需要來回轉換。也就是說,您可以使用'string.getBytes(StandardCharsets.UTF_8)'和'new String(bytes,StandardCharsets.UTF_8)'在字符串及其字節數組表示之間進行有效轉換。 – 2014-10-16 19:27:46
如果您更喜歡將字符串作爲字符串而不是字節來處理,您可能還想使用Base-64。 – rossum 2014-10-16 22:26:43