Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 实现bouncy castle aes 256_Java_Aes_Bouncycastle - Fatal编程技术网

Java 实现bouncy castle aes 256

Java 实现bouncy castle aes 256,java,aes,bouncycastle,Java,Aes,Bouncycastle,我正在开发聊天应用程序。主要功能是以加密的形式发送消息,当消息到达目的地时,可以对其进行解密。我遇到的问题是消息在目的地没有被解密,但是它们以加密的形式到达目的地 代码的工作原理: 客户端A向客户端B发送消息“Hello” 当客户端A单击“发送消息”按钮时,我将该文本保存在一个字符串中,然后该字符串与密钥和iv一起传递给方法Encrypt,如下所示 en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes()); 我将该字节(en)转

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

代码的工作原理:

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

    en=enc.encrypt(msg.getBytes(), key.getBytes(), iv.getBytes());
    
    我将该字节(
    en
    )转换为字符串,并将其发送给另一个客户端B

  • 当我打开接收消息的另一个类时,我会得到字符串(en),然后再次将其转换为字节,然后传递给Decrypt方法。但是每当我运行这个项目时,它就不起作用了。在试捕中试着这么做,但也没有成功。可能是因为它已经出现在一个大的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()
    依赖于平台,因此您可能会在不同的系统上获得不同的字节。此外,并非所有字节都是有效的字符编码。因此,如果您的密钥/IV由安全的随机字节组成(它们应该是这样的),那么您的解密将失败……有时


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

    您的问题是一个非常不具体的“通过编写代码来修复代码,使其正常工作”。你的问题格式很差,这让我觉得你没有花太多时间。你对省略号的过度使用也让我觉得你太过分了。在办公时间尽可能多地与导师/助教在一起,但你可能仍然会因为落后太多而无法赶上。我刚刚测试了你的加密/解密代码,它可以工作。你的问题一定在别处。因此,我投票结束了这个问题。注意:您真的应该在发布代码示例之前测试它。我花了两分钟才弄明白代码是否正常工作。关于样式的旁注:不要从方法中抛出
    异常
    ,而只抛出必要的已检查异常(
    IllegalStateException,InvalidCipherTextException
    )。我测试了代码伴侣,它工作正常。。。。。但是当我在我的项目中使用这个代码时,我得到了错误,字符串是加密的,但它没有解密。。。。我将必须加密的字符串传递到此程序,然后在接收客户端,我将加密的字符串传递给解密的方法,但它不起作用…@SyedHassaanAli我们无法为您调试整个程序。试着缩小范围,找出哪里出了问题。也许你的网络发送代码有问题?首先尝试发送明文,然后再尝试密文。谢谢你的帮助,伙计我用这个代码替换了那个代码,它成功了…………你可能会从那边接受的答案中得到一些提示,特别是关于字符编码/解码,但那里的代码不安全。当然不要使用ECB模式。试试我的答案。