当前位置: 首页 > 知识库问答 >
问题:

实施bouncy castle aes 256

凌征
2023-03-14

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

>

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

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

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

    当我打开接收消息的另一个类时,我得到字符串(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);
      }
    }
    
  • 共有1个答案

    汪晟睿
    2023-03-14

    您正在定期使用string.getBytes()。这几乎是你犯错误的一个地方。getBytes()依赖于平台,因此您可能在不同的系统上获得不同的字节。此外,并非所有字节都是有效的字符编码。因此,如果您的密钥/IV由安全的随机字节组成(它们应该如此),那么您的解密就会失败...有时。

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

     类似资料:
    • 问题内容: 我尝试实现冒泡排序,但是不确定它是否正确。如果您可以看一下它,并且它是气泡式的,并且可以通过更好的方式完成,请不要害羞。这是代码: 问题答案: 这是冒泡排序的正常实现,似乎还可以。可以进行几种优化,但是总体思路是相同的。这里有一些想法: 如果在内循环中未执行任何交换时,外循环有一个迭代,则中断,无用继续 在外循环的每次迭代中,交换内循环的方向-从左至右执行一次,然后从右至左执行一次(这

    • 问题内容: 海 我想建立一个包含聊天的网站。我正在使用PHP,我想要一个代码来实现与php的聊天。有人可以帮助我做到这一点吗?我知道阿贾克斯。我不懂其他语言… 问题答案: 我们目前正在与LiveZilla合作,这非常好,这是公司唯一必须拥有Windows PC的东西。操作员界面位于“ .NET”上 livezilla

    • 有人能解释一下为什么我的启动/停止按钮不起作用吗?这不是一个完整的秒表,但我被困在这里。感谢您的帮助!这是我第一次在论坛上发帖,所以如果我的帖子有任何问题,请告诉我。这是我的代码:

    • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”

    • Storm 使用 CGroup 来限制 worker 的资源使用, 以保证公平和 QOS. 请注意:CGroups 目前仅支持 Linux 平台(内核版本 2.6.24 及更高版本) 设置 要使用 CGroups, 请确保正确安装 cgroups 并配置 cgroup.有关设置和配置的更多信息, 请访问: https://access.redhat.com/documentation/en-US/

    • 问题内容: 我的快速搜索显示了参考实现(http://stax.codehaus.org),Woodstox实现(http://woodstox.codehaus.org)和Sun的SJSXP实现(https://sjsxp.dev.java.net / )。 请评论它们的相对优点,并让我介绍我应考虑的任何其他实现。 问题答案: 伍德斯托克斯为我赢得了每一次胜利。这不仅是性能,而且-sjsxp抽搐

    • 问题内容: 我需要NFC标签的CRC16实现。正如标准告诉我的那样,这是ISO / IEC13239,并提供了示例C代码。我将此代码翻译成Java,但结果却是错误的: 正如标准告诉我的那样,应该创建 AC版本的CRC值的字节序列在第42页上:http : //www.waazaa.org/download/fcd-15693-3.pdf 同样,其他CRC实现也不起作用:crc16实现java 第一

    • 我有一个Java Web应用程序,我想将其作为服务提供商并实现SAML。我不确定如何做这件事的工作流程。 我已经阅读了这个SO问题,但仍然无法完全理解。在问题中,他们说他们需要向IDP发送请求,如果我是对的,称为断言。 如何创建断言?我在那里看到了样品。但是在哪里传递登录凭据呢? 另外,我如何在IDP注册我的应用程序,我是否需要安装IDP为此提供的一些证书?工作流程是什么? 谢谢