我正在编写简化的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。
答案 0 :(得分:0)
您还没有提供解密代码,因此我们无法确定,但我猜您在填充字符串时错过了编码。默认情况下,Java Strings以UTF-16编码。由于您在加密时强制使用UTF-8,因此我假设您在解密时也执行相同的操作。问题是,当您将加密的字节转换为String进行存储时,如果您将其默认设置为UTF-16,那么您可能最终会得到一个双字节字符,因为10001010是138,这超出了用单个字节表示的ASCII字符的127范围。
所以&#34; x&#34;你得到的是代码页的字节,后跟实际字符的字节。正如评论中所建议的那样,您最好只将加密字节存储为字节,并且在将它们解密之前不要将它们转换为字符串。