JavaでXORによる暗号化
JavaでXORによる暗号化について調べていたら下記URLのサイトを見つけました。
http://www.eeb.co.jp/2007/07/_10_1.html
そこでサンプルにあった下記プログラムをvalue と key を変えて実行してみたところ
value の中の「は」、「で」がうまく復元されず文字化けしてしまいました。
どこが悪いのかよくわからないのですがお分かりになられる方がいらっしゃいましたら
教えていただけますでしょうか。
public class XorTest {
//==================================================
// メイン
//==================================================
public static void main(String[] args) {
String value = "abcd本日はお日柄もよろしいようで";
String key = "1";
// 暗号化前出力
print("暗号化前", value);
// 暗号化
byte[] byteEncodeArray = encode(value.getBytes(), key);
value = new String(byteEncodeArray);
// 暗号化後出力
print("暗号化後", value);
// 復元
byte[] byteDecodeArray = decode(value.getBytes(), key);
value = new String(byteDecodeArray);
// 復元後出力
print("復元後", value);
}
//==================================================
// 暗号化
//==================================================
private static byte[] encode(byte[] src, String key) {
byte[] byteKeyArray = new byte[0];
byte[] byteEncArray = new byte[src.length];
// キーの文字列を変換する文字列をカバーするまで繰り返す
while(byteKeyArray.length < src.length) {
byteKeyArray = (new String(byteKeyArray) + key).getBytes();
}
// 変換
for (int i = 0; i < src.length; i++) {
byteEncArray[i] = (byte)(src[i]^byteKeyArray[i]);
}
return byteEncArray;
}
//==================================================
// 復元
//==================================================
private static byte[] decode(byte[] src, String key) {
return encode(src, key);
}
//==================================================
// ダンプ文字列取得
//==================================================
private static String getDump16(byte[] value) {
StringBuffer buf = new StringBuffer();
for (int i = 0; i < value.length; i++) {
String hex = Integer.toHexString((int)value[i] & 255);
// 4桁に揃える
hex = "0000" + hex;
hex = hex.substring(hex.length() - 4, hex.length());
// バッファに追加(空白区切り、10桁ずつ改行)
buf.append(hex + (i % 10 == 9?System.getProperty("line.separator"):" "));
}
return buf.toString().trim();
}
private static void print(String title, String value) {
System.out.println("【 " + title + " 】");
System.out.println("-----------------------------");
System.out.println(value);
System.out.println(getDump16(value.getBytes()));
System.out.println();
System.out.println();
}
}
補足
説明不足で申し訳ありません。 >例えば半角カナは、SJISでは一文字1バイトですが、>日本語EUCでは一文字2バイトです。 >欲しい数字はどちらですか? 半角カナは1byteでカウントしたいです。 ということはやはりgetBytes("SJIS")で良いということなのでしょうか?