作者phstudy (study)
看板java
标题Re: [问题] 使用JAVA API写AES加密器的问题
时间Mon Dec 10 03:00:51 2012
: 我试过 byte[] key = 字串.getBytes(); 这方法,不过好像不对,变成只要输入
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
key阵列中储存的会是每个字元透过预设字元集转换後的结果
假设预设字元集为MS950
byte[] key = "00000001".getBytes() ,会返回长度为8的byte array
key[0]~[6]均是48 // ASCII value 48代表字元0
key[7]是49
而你想要的结果是
byte[] key = "00000001".getXXX() ,返回长度为1的byte array
且key[0]的值要是1
做法上可先将 字串 拆开为每8个字元一组,每一组代表一个8bits String
再将8bits String转换为byte
具体实作如下:
String keyString = "10000000";
String[] byteStrings = new String[keyString.length() / 8];
byte[] key = new byte[byteStrings.length];
int curpos;
final int bitsPerByte = 8;
for(int i = 0; i < byteStrings.length; i++) {
curpos = i * 8;
byteStrings[i] = keyString.substring(curpos, curpos + bitsPerByte);
}
for(int i = 0; i < byteStrings.length; i++) {
/*
java中byte是以signed two's complement来储存
故需透过Integer.parseInt将8bits String转换为int, 再把int转为byte
直接用Byte.parseByte, 会导致值超出byte可以表示的范围(-128~127)
如:10000001(binary) = 129(decimal)
补充:int 转 byte
129(decimal)以int存在记忆体中会是00000...10000001 (共32 bits)
转成byte时会直接截掉int的前三个bytes, 变成10000001 (8 b1ts)
*/
byte eachByte = (byte)Integer.parseInt(byteStrings[i], 2);
key[i] = eachByte;
}
另外也可以用bitwise的方式来做~
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 123.193.183.7
1F:推 sunsam777:可以了耶 不过bitsPerByte好像是7 12/10 22:00
2F:→ sunsam777:eachByte 是不是多余的@@ 感谢您的大力协助 12/10 22:02
3F:推 sunsam777:懂了 bitsPerByte是8 @@ 12/11 03:40