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

Java奇数加解密结果中的Bouncycastle

杜俊风
2023-03-14

当我第一次开始构建加密过程时,我被告知使用AES256和PKCS7Padding。经过一番唠叨,我得到了一个服务器代码的C++示例。原来IV是256位,所以我不得不使用RijndaelEngine代替。此外,为了使其正常工作,我必须使用zerobytepadding。

下面是我的代码:

 socket = new Socket(remoteIP, port);

 outputStream = new PrintWriter(socket.getOutputStream());
 inputStream = new BufferedReader(new InputStreamReader(socket.getInputStream()));

 byte[] base_64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/".getBytes("UTF-8");

 Security.addProvider(new BouncyCastleProvider());

 public String AESEncrypt(String out) throws IOException, DataLengthException, IllegalStateException, InvalidCipherTextException {
    byte[] EncKey = key;
    byte randKey;
    Random randNumber = new Ranhtml" target="_blank">dom();

    randKey = base_64[randNumber.nextInt(base_64.length)];
    EncKey[randKey&0x1f] = randKey;

    RijndaelEngine rijndaelEngine = new RijndaelEngine(256);
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(rijndaelEngine), new ZeroBytePadding());
    ParametersWithIV keyParameter = new ParametersWithIV(new KeyParameter(EncKey), iv);
    cipher.init(true, keyParameter);

    byte[] txt = out.getBytes();
    byte[] encoded = new byte[cipher.getOutputSize(txt.length)];
    int len = cipher.processBytes(txt, 0, txt.length, encoded, 0);

    cipher.doFinal(encoded, len);

    char keyChar = (char) randKey;
    String encString = new String(Base64.encode(encoded));
    encString = encString.substring(0, encString.length()-1) + randKey;

    return encString;
}

 public void AESDecrypt(String in) throws DataLengthException, IllegalStateException, IOException, InvalidCipherTextException {
    byte[] decKey = key;
    byte[] msg = in.getBytes();
    byte randKey = msg[msg.length-1];
    decKey[randKey&0x1f] = randKey;

    byte[] trimMsg = new byte[msg.length-1];
    System.arraycopy(msg, 0, trimMsg, 0, trimMsg.length);

    in = new String(trimMsg);

    RijndaelEngine rijndaelEngine = new RijndaelEngine(256);
    PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(new CBCBlockCipher(rijndaelEngine), new ZeroBytePadding());
    ParametersWithIV keyParameter = new ParametersWithIV(new KeyParameter(decKey), iv);
    cipher.init(false, keyParameter);

    byte[] encoded = Base64.decode(in.trim());
    byte[] decoded = new byte[cipher.getOutputSize(encoded.length)];
    int len = cipher.processBytes(encoded, 0, encoded.length, decoded, 0);
    cipher.doFinal(decoded, len);

    String decString = new String(decoded);
}

下面是我用来发送和接收消息的一个测试函数:

 public void serverTest() throws DataLengthException, IllegalStateException, InvalidCipherTextException, IOException {

     //out = AESEncrypt(out);

     outputStream.write(out + "\n");
     outputStream.flush();

     String msg = "";

     while ((msg = inputStream.readLine()) != null) {
        AESDecrypt(msg);
     }
 }
 org.bouncycastle.util.encoders.DecoderException: unable to decode base64 string: 
 String index out of range: -4 at org.bouncycastle.util.encoders.Base64.decode(Unknown Source)

或者我在错误之前的最后一行看起来如下所示:

 ?"??n?i???el????s???!_S=??ah????CR??l6??]?{?l??Y?????Gn???+?????9!'??gU&4>??{X????G?.$c=??0?5??GP???_Q5????8??Z\?~???<Kr?????[2\ ???a$?C??z%?W???{?.?????eR?j????~?B"$??"z??W;???<?Yu??Y*???Z?K?e!?????f?;O(?Zw0B??g<???????????,)?L>???A"?????<?????W??@\???f%??j ?EhY/?? ?5R?34r???@?1??I??????M

如果我将加密/解密设置为使用PKCS7Padding,那么当我的消息被加密时没有得到响应,但是通过从服务器解密,我得到2到6个响应,然后

 org.bouncycastle.crypto.InvalidCipherTextException: pad block corrupted

我对此不知所措。我不知道我可能做错了什么所以我来到这里。我希望so社区能指出我的错误,引导我走上正确的方向。

encString += (char)randKey;
return UTF8Encoding.UTF8.GetString(resultArray);

我要做的就是这些。我已经尝试过UTF-8编码任何地方的字节或新字符串,我已经尝试过使BurrferReader流UTF-8,但它仍然是垃圾。

共有1个答案

徐嘉谊
2023-03-14

你给BCGIT播种了吗?这有bouncycastle代码和示例。我正在使用这个存储库中的Csharp版本。https://github.com/bcgit/bc-java

所有crypto原语示例都存储在这里:https://github.com/bcgit/bc-java/tree/master/core/src/test/java/org/bouncycastle/crypto/test

尝试使用此代码测试Aes-CBC

private void testNullCBC()
    throws InvalidCipherTextException
{
    BufferedBlockCipher b = new BufferedBlockCipher(new CBCBlockCipher(new AESEngine()));
    KeyParameter kp = new KeyParameter(Hex.decode("5F060D3716B345C253F6749ABAC10917"));

    b.init(true, new ParametersWithIV(kp, new byte[16]));

    byte[] out = new byte[b.getOutputSize(tData.length)];

    int len = b.processBytes(tData, 0, tData.length, out, 0);

    len += b.doFinal(out, len);

    if (!areEqual(outCBC1, out))
    {
        fail("no match on first nullCBC check");
    }

    b.init(true, new ParametersWithIV(null, Hex.decode("000102030405060708090a0b0c0d0e0f")));

    len = b.processBytes(tData, 0, tData.length, out, 0);

    len += b.doFinal(out, len);

    if (!areEqual(outCBC2, out))
    {
        fail("no match on second nullCBC check");
    }
}
 类似资料:
  • 我已经尝试使用cipher.getinstance(“rsa/ecb/pkcs1padding”),但没有给出预期的结果。 感谢所有的帮助。祝你有美好的一天。

  • 我想在Java文件中存储一个加密的密码。我看到了一个使用javax.crypto的解决方案,但问题是密钥是动态生成的,并且是随机的。 有没有办法告诉javax.crypto方法: 这是否可以替换为基于某个私钥生成一次的我自己的密钥? 有谁能给我指出一些如何做到这一点的资源吗?

  • 问题内容: 执行以下代码时: 显示以下输出: 1.0000001 但是输出应该是 1.0000000 ,对吧?如我错了请纠正我..!! 问题答案: 对于IEEE 754标准,0.1并不是真正的“ 0.1”。 0.1编码为:(带有浮点数) 0是符号(=正) 01111011指数(= 123-> 123-127 = -4 (127是IEEE 754中的 偏差 )) 100110011001100110

  • 问题内容: PHP功能: Java函数 } 返回null。 请注意,我们不允许更改PHP代码。有人可以帮助我们在Java中获得相同的结果吗?非常感谢。 问题答案: 如果您不只是简单地将例程中的可能内容吞噬掉,那么您将对发生的事情有了更好的了解。如果函数正在返回,那么显然发生了异常,您需要知道它是什么。 实际上,例外是: 可以肯定的是,您的纯文本长度只有11个Java字符,按照您的默认编码,它将为1

  • 我有自己的方法。net项目来加密密码 我的任务是将此方法转换为java,但在java中,我没有得到与该方法相同的结果。网络版 我的java代码是 加密“1”的结果是: 而java是 你能帮我解决这个问题吗?

  • 本文向大家介绍java中DES加密解密,包括了java中DES加密解密的使用技巧和注意事项,需要的朋友参考一下 废话不多说,直接奉上代码: 代码一 代码二 以上就是本文关于DES加密解密的代码了,希望对大家学习java有所帮助。