【问题标题】:Bouncycastle java encoding/decoding. Missing bytes?Bouncycastle java 编码/解码。缺少字节?
【发布时间】:2013-06-25 21:53:47
【问题描述】:

我需要使用 CBC Rijndael 加密对文本进行编码/解码。

输入: 这个 loooooooooooooooooo000000000ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong String

编码输入: ?†´Ú½mΗ“AŽyÝ¢ƒô]5X-å;'Bdž.̵¼èüÈíÖXÈ*©Ã¼ç–hKBµ$híƒEu-ȸU ¤'AÓÈÿ?Ÿûä¸: OW?B>ÐZ²ñ ,zÅë(C'®5ÐixRópE%€.@vhrm6µ5©bŠ?Ç¡$q¿J^÷g“e†ì??bt ì%q‘ÕQÚ5µã?ƒ

解码输入: “这个力很强 loooooooooooooooooooo000000000oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo ” - 32个空格代替结尾(字节值为0)

我错过了最后的字节。谁能告诉我为什么?

这是我的代码:

公共类 BouncyDecoder {

byte[] IV = null;
byte[] encryptionKey = null;
Cipher cipher;
SecretKeySpec key;
BlockCipher blockCipher;
ParametersWithIV _param;

PaddedBufferedBlockCipher mode;
int blockSize;

public BouncyDecoder() {
    Security.addProvider(new BouncyCastleProvider());
    try {
        IV = "1234567891234567891234567891234".getBytes("UTF-8");
        encryptionKey = "1234567891123453456789123456781".getBytes("UTF-8");

        blockCipher = new CBCBlockCipher(new RijndaelEngine(256));
        _param = new ParametersWithIV(new KeyParameter(encryptionKey), IV);
        mode = new PaddedBufferedBlockCipher(blockCipher);
        blockSize = blockCipher.getBlockSize();
    } catch (Exception e) {
    }
}

public byte[] decrypt(byte[] encodedText) {
    byte[] decoded = new byte[mode.getOutputSize(encodedText.length)];
    try {
        mode.init(false, _param);

        int bytesProcessed = 0;
        int i=0;
        for (i = 0; i < (encodedText.length / 32) ; i++){               
            bytesProcessed += mode.processBytes(encodedText, i * blockSize, blockSize, decoded, bytesProcessed);
        }

        mode.doFinal(decoded, (i-1)*blockSize);
    } catch (Exception e) {
    }
    return decoded;
}

public byte[] encrypt(byte[] normalText) {
    byte[] encryptedText = new byte[mode.getOutputSize(normalText.length)];
    try {
        mode.init(true, _param);

        int bytesProcessed = 0;
        int i=0;
        for (i = 0; i < (normalText.length / 32); i++) {
            bytesProcessed += mode
                    .processBytes(normalText, i * blockSize, blockSize, encryptedText, bytesProcessed);
        }

        mode.doFinal(encryptedText, (i-1)*blockSize);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return encryptedText;
}

}

【问题讨论】:

    标签: java bouncycastle


    【解决方案1】:

    您的循环似乎没有处理输入字符串中的所有字节:

    for (i = 0; i < (normalText.length / 32); i++) {
            bytesProcessed += mode
                    .processBytes(normalText, i * blockSize, blockSize, encryptedText, bytesProcessed);
    }
    

    它只处理从 0 到 (text.Length/32)*blockSize 的字节。

    因此,如果输入数组的长度为 35 个字节,则永远不会处理最后 3 个字节。

    改用这样的东西怎么样:

    bytesProcessed = mode.processBytes(normalText, 0, normalText.length, encryptedText,0);
    //second argument of doFinal is offset in output buffer.
    mode.doFinal(encryptedText, bytesProcessed);
    

    如果这个可以工作,你肯定会知道问题是循环计数器中的一个错误。

    更新:如果你想一次加密一个块,你可以尝试这样的事情:

    for(int i=0; i<=(normalText.length/blockSize); i++) {
         int offset = i*blockSize;
         //To handle last block of bytes in input
         int len = Math.min(blockSize,normalText.length-offset);
         bytesProcessed += mode.processBytes(normalText,offset,len,encryptedText,bytesProcessed);
    }
    mode.doFinal(encryptedText, bytesProcessed);
    

    解密也是如此

    【讨论】:

      猜你喜欢
      • 2012-10-24
      • 2014-05-29
      • 2013-05-25
      • 2023-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2019-03-20
      相关资源
      最近更新 更多