我正在尝试开发提供2字节字符编码的对称加密软件。
但是,以下代码无法加密2字节字符,我不知道原因。
(该代码适用于英语)
package com.messagesecretpro;
import gnu.crypto.cipher.Blowfish;
import gnu.crypto.util.Base64;
import java.io.*;
import java.lang.reflect.Array;
public class BlowfishCipher {
public static String encrypt(String cookieValue, String key) {
byte[] plainText;
byte[] encryptedText;
Blowfish blowfish = new Blowfish();
// create a key
// String key = "zzforexamplekeytext";
byte[] keyBytes = key.getBytes();
Object keyObject = blowfish.makeKey(keyBytes, 8);
// make the length of the text a multiple of the block size
if ((cookieValue.length() % 8) != 0) {
while ((cookieValue.length() % 8) != 0) {
cookieValue += " ";
}
}
// initialize byte arrays for plain/encrypted text
plainText = cookieValue.getBytes();
encryptedText = new byte[cookieValue.length()];
// encrypt text in 8-byte chunks
for (int i = 0; i < Array.getLength(plainText); i += 8) {
blowfish.encrypt(plainText, i, encryptedText, i, keyObject, 8);
}
String encryptedString = Base64.encode(encryptedText);
return encryptedString;
}
public static String decrypt(String cookieValue, String key)
throws UnsupportedEncodingException {
byte[] encryptedText;
byte[] decryptedText;
Blowfish blowfish = new Blowfish();
// create the key
// String key = "zzforexamplekeytext";
byte[] keyBytes = key.getBytes();
Object keyObject = blowfish.makeKey(keyBytes, 8);
// make the length of the string a multiple of
// the block size
if ((cookieValue.length() % 8) != 0) {
while ((cookieValue.length() % 8) != 0) {
cookieValue += " ";
}
}
// initialize byte arrays that will hold encrypted/decrypted
encryptedText = Base64.decode(cookieValue);
decryptedText = new byte[cookieValue.length()];
// Iterate over the byte arrays by 8-byte blocks and decrypt.
for (int i = 0; i < Array.getLength(encryptedText); i += 8) {
blowfish.decrypt(encryptedText, i, decryptedText, i, keyObject, 8);
}
String decryptedString = new String(decryptedText);
return decryptedString;
}
}
答案 0 :(得分:2)
你应该阅读文件; Blowfish类实现了一个分组密码,不一个block cipher mode of operation such as ECB or CBC,也没有padding。因此,您只能将给定的加密方法用于数据块(8个字节)。
您正在尝试迭代(使用for next循环)加密每个字节(或当前重叠的块)。但是,如果encrypt
方法的输入不包含要加密的完整块(来自给定的偏移量),则会得到索引超出范围的异常。
所以:
该算法的作者Bruce Schneier建议不要在很久以前使用这种密码。虽然它仍然被认为是安全的,但是8字节的块大小使得它在大多数操作模式中相对不安全。
最好使用AES,在经过身份验证的操作模式(如GCM)中使用AES,使用唯一的随机数/密钥组合。通常最好使用更高级别的协议/容器格式,这样您就不必(过度)依赖自己来保证密文的安全。