gpt4 book ai didi

java - 实现充气城堡 aes 256

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:03 27 4
gpt4 key购买 nike

我正在开发一个聊天应用程序。主要特点是以加密形式发送消息,当它们到达目的地时可以被解密。我遇到的问题是消息没有在目的地解密,但是它们以加密形式到达目的地。

代码的工作原理:

  1. 客户端A发送消息“Hello”给客户端B...
  2. 当客户端 A 单击“发送消息”按钮时,我将该文本保存在一个字符串中,然后将该字符串与 key 和 iv 一起传递给加密方法,如下所示...

    en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes());

    我将该字节 (en) 转换为字符串并将其发送给另一个客户端 B。

  3. 当我打开接收消息的另一个类时,我得到字符串 (en),然后再次将其转换为字节,然后传递给 Decrypt 方法。但是每当我运行该项目时,它都不起作用。尝试在 try catch 中这样做,但也没有用。可能是因为它已经在一个大的 try catch 语句中,这使得它更加困惑。

我的代码:

package com.socket;

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;

public class Encrypt {

public Encrypt() {
}

public static byte[] cipherData(PaddedBufferedBlockCipher cipher, byte[] data)
throws Exception {
int minSize = cipher.getOutputSize(data.length);

byte[] outBuf = new byte[minSize];

int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);

int length2 = cipher.doFinal(outBuf, length1);

int actualLength = length1 + length2;

byte[] result = new byte[actualLength];

System.arraycopy(outBuf, 0, result, 0, result.length);

return result;
}

public static byte[] decrypt(byte[] cipher, byte[] key, byte[] iv)
throws Exception {

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
new CBCBlockCipher(new AESEngine()));

CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);

aes.init(false, ivAndKey);

return cipherData(aes, cipher);
}

public byte[] encrypt(byte[] plain, byte[] key, byte[] iv) throws Exception {

PaddedBufferedBlockCipher aes = new PaddedBufferedBlockCipher(
new CBCBlockCipher(

new AESEngine()));

CipherParameters ivAndKey = new ParametersWithIV(new KeyParameter(key), iv);

aes.init(true, ivAndKey);

return cipherData(aes, plain);
}
}

最佳答案

您定期使用 String.getBytes()。这几乎可以肯定是您出错的地方。 getBytes() 依赖于平台,因此您可能会在不同的系统上获得不同的字节。此外,并非所有字节都是有效的字符编码。因此,如果您的 key /IV 包含安全的随机字节(它们应该如此),那么您的解密将失败……有时。

一般的答案是使用指定的字符编码(例如 UTF-8)将字符转换为字节,然后使用 base-64 或十六进制等编码将字节转换为字符。

关于java - 实现充气城堡 aes 256,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16999563/

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