gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 05:34:47 24 4
gpt4 key购买 nike

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

最佳答案

您应该阅读文档; Blowfish 类实现分组密码,不是 block cipher mode of operation such as ECB or CBC ,也不是 padding 。因此,您只能对数据 block (8 字节)使用给定的加密方法。

您正在尝试迭代(使用 for next 循环)加密每个字节(或当前重叠的 block )。但是,如果 encrypt 方法的输入不包含要加密的完整 block (从给定的偏移量开始),您将收到索引越界异常。

所以:

  1. 使用具有良好操作模式的分组密码,并且 - 当操作模式需要时 - 填充;
  2. 不要使用早已废弃的加密库或算法。
<小时/>

该算法的作者布鲁斯·施奈尔 (Bruce Schneier) 很久以前就建议不要使用该密码。尽管它仍然被认为是安全的,但 8 字节的 block 大小使其在大多数操作模式下相对不安全。

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

关于Java - 通过 BlowFish 密码进行 2 字节字符加密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095556/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com