Java - 通过BlowFish密码进行2字节字符加密

时间:2014-08-02 13:30:06

标签: java encryption character blowfish

我正在尝试开发提供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;
    }
}

1 个答案:

答案 0 :(得分:2)

你应该阅读文件; Blowfish类实现了一个分组密码,一个block cipher mode of operation such as ECB or CBC,也没有padding。因此,您只能将给定的加密方法用于数据块(8个字节)。

您正在尝试迭代(使用for next循环)加密每个字节(或当前重叠的块)。但是,如果encrypt方法的输入不包含要加密的完整块(来自给定的偏移量),则会得到索引超出范围的异常。

所以:

  1. 使用良好操作模式的块密码,以及 - 当操作模式需要时 - 填充;
  2. 请勿使用很久以前被遗弃的加密库或算法。

  3. 该算法的作者Bruce Schneier建议不要在很久以前使用这种密码。虽然它仍然被认为是安全的,但是8字节的块大小使得它在大多数操作模式中相对不安全。

    最好使用AES,在经过身份验证的操作模式(如GCM)中使用AES,使用唯一的随机数/密钥组合。通常最好使用更高级别的协议/容器格式,这样您就不必(过度)依赖自己来保证密文的安全。