JavaでXORによる暗号化

このQ&Aのポイント
  • JavaでXORによる暗号化について調査しました。提供されたサンプルプログラムを実行したところ、一部の文字が文字化けしてしまいました。問題の原因が分からず困っています。
  • JavaのXOR暗号化について調査しました。提供されたサンプルプログラムを実行したところ、一部の文字が文字化けしてしまいました。
  • JavaでXOR暗号化を実装しましたが、一部の文字が文字化けしてしまいます。問題の原因がわかる方がいれば教えてください。
回答を見る
  • ベストアンサー

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

  • Java
  • 回答数1
  • ありがとう数0

質問者が選んだベストアンサー

  • ベストアンサー
  • utun01
  • ベストアンサー率40% (110/270)
回答No.1

一旦StringにしてからgetBytesしている辺りは大丈夫なんでしょうか。 以下の部分ですが、これではどうでしょう? // 復元 byte[] byteDecodeArray = decode(byteEncodeArray, key); ちなみに、Java詳しくないのでフィーリングで言っています。 見当はずれだったら無視して下さいw

unko347
質問者

補足

ご回答ありがとうございます。 ご指摘の通りでした。 大変助かりました。ありがとうございました。

関連するQ&A

  • javaについて質問です。

    javaについて質問です。 シーザー暗号の暗号化と復号化のプログラムをつくりたいのですが... import java.io.*; class Prob6_2 { public static void main(String [] args)throws IOException { int key; //キー番号 String orgStr; //ターゲット文字列 String encStr; //暗号化文字列 String decStr; // 復号化文字列 String temp; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.print("ターゲット文字列:"); orgStr=br.readLine(); System.out.print("キー番号:"); temp=br.readLine(); key=Integer.parseInt(temp); Cipher cip=new Cipher (); encStr=cip.encrypt(orgStr,key); decStr=cip.decrypt(encStr,key); System.out.println("[Original Code]"+orgStr); System.out.println("[Encrypted Code]"+encStr); System.out.println("[Decrypted Code]"+decStr); } } class Cipher { String encrypt(String str,int key) { for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c+key); /*この後どのように一つずつの文字をつなげて文字列にしたら良いか分かりません。StringBuffer クラスのインスタンス をつかうといいというヒントは問題集に書いてあるのですが....教えて下さい*/ } } String decrypt(String str,int key) { for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); /*この後どのように一つずつの文字をつなげて文字列にしたら良いか分かりません。StringBuffer クラスのインスタンス をつかうといいというヒントは問題集に書いてあるのですが....教えて下さい*/ } } } class Cipherのところにコメントでも書いてあるのですが、一つずつの文字をつなげて文字列にしたら良いか分かりません。どのように実現したら良いのでしょうか?><教えてください>< 違っているところがあればそこも教えて頂けるとたすかります。 お願いします>< できたらStringBufferをつかったやり方を教えてください><」

    • ベストアンサー
    • Java
  • javaについて質問です。お願いします><

    javaについて質問です。お願いします>< シーザー暗号を実現するプログラムをじゃいたのですが、import java.io.*; class Prob6_3 { public static void main(String [] args)throws IOException { int key; //キー番号 String orgStr; //ターゲット文字列 String encStr; //暗号化文字列 String decStr; // 復号化文字列 String temp; BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); System.out.print("ターゲット文字列:"); orgStr=br.readLine(); System.out.print("キー番号:"); temp=br.readLine(); key=Integer.parseInt(temp); Cipher cip=new Cipher (); encStr=cip.encrypt(orgStr,key); decStr=cip.decrypt(encStr,key); System.out.println("[Original Code]"+orgStr); System.out.println("[Encrypted Code]"+encStr); System.out.println("[Decrypted Code]"+decStr); } } class Cipher { String encrypt(String str,int key) { String ret="";             //ココです1 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c+key); ret+=c; } return ret; } String decrypt(String str,int key) { String ret="";              //ここです2 for(int i=0;i<str.length();i++){ char c=str.charAt(i); c=(char)((int)c-key); ret+=c; } return ret; } }   とこんな感じになり実行もできるのですが、class CipherのString encrypt(String str,int key)やString decrypt(String str,int key)のところで一つずつ文字をつなげて文字列にするにはStringBufferクラスのインスタンスを利用すると簡単だとききました。だけど記述方法がよくわからなく使用した場合のreturn文の書き方もイマイチわかりません><なのでできるだけ詳しく教えて頂けないでしょうか??お願いします。//ココですと書いてあるところです。お願いします><

    • ベストアンサー
    • Java
  • Javaの初歩

    変数のスコープみたいなものが、いまだに良く分かって ないみたいなんです。このプログラムを実行すると、 15 0 20と表示されるのですが、最後がなぜ15ではなく て、20なのかがなかなか分かりません。どなたか教えて 頂けませんでしょうか。お願いします。 class Value { public int i = 15; } public class Test { public static void main(String argv[]) { Test t = new Test(); t.first(); } public void first() { int i = 5; Value v = new Value(); v.i = 25; second(v, i); System.out.println(v.i); } public void second(Value v, int i) { i = 0; v.i = 20; Value val = new Value(); v = val; System.out.println(v.i + " " + i); } }

    • ベストアンサー
    • Java
  • java 初心者ですが・・・・

    教えてください。 次のプログラムの出力は「2」になるんですがイマイチ解釈できません。 分かりやすい説明などあればご教授願います。 class NarrowingConversion{ public static void main (String[] args){ byte b; int i = 258; b = (byte)i; System.out.println(b); } } よろしくお願いいたします。

    • ベストアンサー
    • Java
  • Stringオブジェクトの文字コードの変換

    NewString = new String(b.getBytes("iso-8859-1"),"Shift_JIS"); でShift-Jisに変換できるとありましたが、どうも出力の 日本語部分が3Fになってしまってうまくいきません。 テスト用に以下のコードを作ってみました。 import java.io.File; import java.io.FileWriter; import java.io.BufferedWriter; import java.io.IOException; import java.io.FileOutputStream; public class Test { public static void main(String[] args) { try{ String regex_title; regex_title = "制限をしている場合"; System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getUTF8(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); regex_title = "制限をしている場合"; regex_title = getShiftJIS(regex_title); System.out.println(getHexString(regex_title.getBytes())); System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); }catch(Exception ex){ } } public static String getHexString(byte[] b){ String buff=""; try{ for(int i=0;i<b.length;i++) buff += String.format("\\x%02x", b[i]); }catch(Exception ex){ } return buff; } public static String getUTF8(String b){ try { //UTF-8へ変換 return new String(b.getBytes(), "UTF-8"); } catch (Exception e) { e.printStackTrace(); return b; } } public static String getShiftJIS(String b){ try { //UTF-8へ変換 return new String(b.getBytes(),"Shift_JIS"); } catch (Exception e) { e.printStackTrace(); return b; } } // @Override } //////////////////////////////////////////////////////////// 1. System.out.println(getHexString(regex_title.getBytes("iso-8859-1"))); の部分の出力をみると3Fに変換されています。 regex_title.getBytes("iso-8859-1")の時点で3Fな事がわかります。 何故でしょうか? 私がやりたい事はStringの内部のコードをUTF8にする事です。 NewString = new String(b.getBytes("iso-8859-1"),"UTF-8"); では、出来ていないようでした。 2. また、以下のコードを実行するとtest.txt test2.txtともに 文字コードがShiftJisで出力されるのはなぜでしょうか? 変換を行わなければ内部処理形式のUnicodeで出力されるの ではないのでしょうか? regex_title = "制限をしている場合"; FileOutputStream fs = new FileOutputStream("./test.txt"); fs.write(regex_title.getBytes()); fs.close(); File file = new File("./test2.txt"); BufferedWriter bw = new BufferedWriter(new FileWriter(file)); bw.write(regex_title); bw.close(); 上はgetBytes()が変換してるのでしょうか? 下はBufferedWriterかFileWriterが変換してる? ではString内部のByteをそのまま出力するにはどうしたら・・・。

    • ベストアンサー
    • Java
  • Javaで配列を定義する方法

    こんにちは、片岡といいます。 Java言語で配列を定義する場合、以下の二つの書式に違いはありますか。 違いがあるとすれば、どのような違いですか。 また、違いがないのならば、どちらの記述がよいのですか。 ご存知の方はいらっしゃいませんか。 (1) public class Main1 { public static void main(String[] args) { String str[] = new String[] { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } (2) public class Main2 { public static void main(String[] args) { String str[] = { new String("itiban"), new String("niban"), new String("sanban"), }; for (int i = 0; i < str.length; i++ ) { System.out.println(str[i]); } } } なお、私の環境は以下の通りです。 OS: Microsoft Windows XP Professional SP2 java: java version "1.4.2_13" 検索エンジンで"配列 オブジェクト java"を検索しましたが、 解決に役立つ情報は見つかりませんでした。

    • ベストアンサー
    • Java
  • javaによるファイル送信のプログラム

    ユニキャスト通信のおけるプログラミングで、1のプログラムを2のプログラムを使ってファイル送信ができるようにしたいのですがうまくいきません。私のjavaの知識が授業についていかなくて図書館でいろいろと本を探したのですが見つかりませんでした。誰か教えていただけませんか? /*1*/ import java.net.*; import java.io.*; public class udpechoServer{ static final int echo_PORT = 7; //エコーポート番号 static final int BUFSIZE = 1024; //バッファサイズ public static void main(String[] args) throws IOException{ int port = echo_PORT; //ポート番号 int cliport; //クライアントポート番号 int len; //データ長 int i; //キーインバッファクリアインデックス DatagramSocket sock = null; //データグラムソケット宣言,初期化 byte[] buf = new byte[BUFSIZE]; byte[] wbuf = new byte[BUFSIZE]; String recvdata; //受信データ try{ sock = new DatagramSocket(port); DatagramPacket recvpacket = new DatagramPacket(buf,BUFSIZE); DatagramPacket sendpacket = new DatagramPacket(buf,BUFSIZE); System.out.println("Connected to echo server"); while(true){ sock.receive(recvpacket); //データ受信 recvdata = new String(recvpacket.getData(),0,recvpacket.getLength()); recvdata = recvdata.trim(); //トリミング(CRLF) wbuf = recvdata.getBytes(); //文字列→バイト配列変換 i = 0; len = wbuf.length; buf = new byte[BUFSIZE]; while(wbuf[i] != 0x0d){ //途中のCR検出 buf[i] = wbuf[i]; //データコピー i++; if(i >=len){ break; } } recvdata = new String(buf,0,i); //バイト配列→文字列変換 System.out.println(recvdata); //画面出力 InetAddress ipadr = recvpacket.getAddress(); cliport = recvpacket.getPort(); buf = recvdata.getBytes(); len = buf.length; sendpacket = new DatagramPacket(buf,len,ipadr,cliport); sock.send(sendpacket); //データ送信 recvpacket.setLength(BUFSIZE); //データグラムパケット長リセット } }catch(SocketException e){ e.printStackTrace(); } } } /*2 */ import java.io.*; class FileCopy { public static void main(String argv[]){ try{ InputStream in = new FileInputStream(argv[0]); //入力ファイルを開く //BufferedInputStreamオブジェクトの生成 BufferedInputStream bin = new BufferedInputStream(in); OutputStream out = new FileOutputStream(argv[1]); //出力ファイルを開く //BufferedOutputStreamオブジェクトの生成 BufferedOutputStream bout = new BufferedOutputStream(out); byte buf[] = new byte[1024]; int c; //読み込みデータがなくなるまで読み込み while((c = bin.read(buf, 0, buf.length)) != -1){ bout.write(buf, 0, c); //データの書き込み処理 } System.out.println("\""+argv[0]+"\" was converted into \""+argv[1]+"\""); bin.close(); //入力ファイルを閉じる bout.close(); //出力ファイルを閉じる }catch(Exception e){} } }

    • ベストアンサー
    • Java
  • Java ApachePOIについて

    サーブレットとApachePOIについて質問です。 下記のソースで書き込んだセルをすべて黄色で塗りつぶしをしたいのですが、 ソースの書き方を教えてください。 以上、お願いします。 「ソース」 // 業務名前 String[] name4 = request.getParameterValues("gyoumuname"); for (int i = 0; i < name4.length; i++) { System.out.println(i + " " + name4[i]); name4[i] = new String(name4[i].getBytes("8859_1"), "UTF-8"); List outList=new ArrayList(); for (int i = 0; i < name4.length; i++) { outList.add(name4[i]); } for (int i = 0; i < outList.size(); i++) { Row row5 = sheet.getRow(8 + i); row5.getCell(3).setCellValue(new HSSFRichTextString(outList.get(i).toString())); } // 値を書き込んだエクセルを出力する FileOutputStream out = null; try { out = new FileOutputStream( "C:\\Users\\satou\\Desktop\\weekreport.xls"); workbook.write(out); } catch (IOException e) { System.out.println(e.toString()); } finally { try { out.close(); } catch (IOException e) { System.out.println(e.toString()); } } 以下省略。

  • String <=> byte配列 の際のエンコード

    なんで、 String str = "あいうえお"; byte[] temp = str.getBytes("8859_1"); String str2 = new String(temp, "8859_1"); System.out.println(str2); このコードが ????? を出力するかわかる方、おしえてください。

    • ベストアンサー
    • Java
  • javaのudp通信について

    javaのudp通信を使用して簡単なチャットプログラムを作っています。サーバーなどは使用しないものです。 送信、受信それぞれのプログラムはできました。送信は送信を繰り返し、受信も受信を繰り返すものです。それをひとつにしたいと考えています。 送信プログラムの詳細はhttp://oshiete1.goo.ne.jp/qa3743572.htmlです。 受信プログラムは下記です。 ご指導お願いします。 ******************************** import java.net.*; public class reciverTest { DatagramPacket packet1; private DatagramSocket socket1; private int port = 19800; public reciverTest() throws Exception { this.socket1 = new DatagramSocket(this.port); } public String receive() throws Exception { byte buffer[] = new byte[256]; int i; packet1 = new DatagramPacket(buffer, buffer.length); this.socket1.receive(packet1); // blocking for (i = 0; i < buffer.length; i++) { if (buffer[i] == '\0') { break; } } String msg = new String(packet1.getData(), 0, i); return msg; } public void close() throws Exception { socket1.close(); } public static void main(String[] args) { reciverTest receiver1; System.out.println("Waiting ..."); try { receiver1 = new reciverTest(); while(true) { String msg = receiver1.receive(); System.out.println("受信したデータ⇒『" + msg +"』を受信しました。"); receiver1.close(); } } catch (Exception ex) { System.err.println("Error: " + ex.getMessage()); } } }

    • ベストアンサー
    • Java

専門家に質問してみよう