2013-06-25 83 views
1

我需要使用CBC Rijndael加密对文本进行编码/解码。Bouncycastle java编码/解码。缺少字节?

输入: 力是强在这个looooooooooooooooooo000000000oooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooong字符串

编码输入:†'Ú½mÎ-“AŽyÝ¢ƒô] 5X-A;“BC†.Ìμ¼èüÈíÖXÈ*©Ã¼ç,hKBμ $híƒEu-ȸU¤'AÓÈÿ?æûä¸:OW?B>ÐZ¡ ,zëë(C'®5ÐixRÉp% ì%q'ÕQÚ5μッ

解码输入: “的力量是强大的在这looooooooooooooooooo000000000ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo” - 在地方结束的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; 
} 

}

+1

我的脸我的脸ᵒh神,不,不拿去ONΘ停止安排* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * ŝ –

回答

1

你的循环似乎并不过程都在输入字符串中的字节:

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

它只处理字节m 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); 

如果这个人是去工作,你一定会知道,这个问题是差一错误的循环计数器。

UPDATE:或者你可以尝试这样的事情,如果你想要一个块同时加密:

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); 

也是一样的解密

+0

THX!它做到了。 – Flavian