将字符串转换为二进制并再次返回不会提供相同的字符串

时间:2015-04-16 18:07:50

标签: java encryption

我正在编写简化的DES算法来加密并随后解密字符串。假设我的初始字符(具有二进制值00101000,我使用以下算法得到:

public void getBinary() throws UnsupportedEncodingException {
    byte[] plaintextBinary = text.getBytes("UTF-8");
    for(byte b : plaintextBinary){
        int val = b;
        int[] tempBinRep = new int[8];
        for(int i = 0; i<8; i++){
            tempBinRep[i] = (val & 128) == 0 ? 0 : 1;
            val <<= 1;
        }

        binaryRepresentations.add(tempBinRep);
    }
}

执行各种排列和转换后,(及其二进制等效转换为10001010及其等效的Š。当我来解密时,我通过getBinary()方法传递相同的字符我现在得到二进制字符串11000010 另一个二进制字符串{{ 1}}转换为ASCII 10001010

这个流氓x(来自哪里?

修改:可以找到完整的课程here

1 个答案:

答案 0 :(得分:0)

您还没有提供解密代码,因此我们无法确定,但我猜您在填充字符串时错过了编码。默认情况下,Java Strings以UTF-16编码。由于您在加密时强制使用UTF-8,因此我假设您在解密时也执行相同的操作。问题是,当您将加密的字节转换为String进行存储时,如果您将其默认设置为UTF-16,那么您可能最终会得到一个双字节字符,因为10001010是138,这超出了用单个字节表示的ASCII字符的127范围。

所以&#34; x&#34;你得到的是代码页的字节,后跟实际字符的字节。正如评论中所建议的那样,您最好只将加密字节存储为字节,并且在将它们解密之前不要将它们转换为字符串。