Java安全学習ノート(一)--シーザーパスワード
シーザーパスワードはローマ拡張期にジュリス・シーザーが創造し、信使を通じて伝達された作戦命令を暗号化するために使われた.暗号化のプロセスは、アルファベット表のアルファベットを一定に移動し、テキストの暗号化を実現することです.アルファベット表のアルファベットを2桁右に移動すると、アルファベットAがCになり、アルファベットBがDになるなど、明文文字列HelloがJgnnqに暗号化されます.その後復号すると、元の文字列が返されます.ここで、移動するビット数2は、暗号化および復号化に用いられる鍵である.
シーザーパスワードの技術的要点:
暗号化する文字列、鍵'を抽出
文字列の各文字を取り出してシフトします.
アルファベットには26文字があり、シフト前に移動したビット数Keyと26を型抜きします.JAVAは文字に正の整数を加えると、アルファベット表で何桁右にシフトするかを表します.移動するビット数が負の場合は、アルファベットで左に何ビット移動するかを表します.
移動前に移動したビット数および26はモジュール化されているが、このようにして右シフトまたは左シフトを実現すると、依然として超境界が発生する.アルファベットxが4ビット右にシフトした場合はアルファベットbであるべきであるが、アルファベットxを4増加した後は26文字の範囲を超えている.もちろん、この場合のパスワードは意味がある(ASCコードテーブルの範囲を超えていない)可能性があり、ここでは明文は他のASCコードとして表される.この例は明文を26文字に表すだけなので、このときif文を2つ増やして判断し、左に境界(c<'a')を超えれば26を増やす.右に境界を超えた場合(c>'z')は26を減算します.また,大文字と小文字で境界を超えたか否かを判断する根拠が異なるため,プログラムでは文字を大文字と小文字に分けてそれぞれ処理する.
シーザーパスワードの技術的要点:
暗号化する文字列、鍵'を抽出
文字列の各文字を取り出してシフトします.
package corejava;
import java.util.Scanner;
/**
* :
* */
public class TestCaesar {
public static void main(String[] args) {
System.out.println("[A ][J ],Please Choose One");
Scanner c=new Scanner(System.in);// Scanner
String s1=c.nextLine();//
if(s1.equalsIgnoreCase("A")){
System.out.println(" :");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
System.out.println(" :");
Scanner sc1=new Scanner(System.in);
int key=sc1.nextInt();// int
Encryption(s, key);
}else if(s1.equalsIgnoreCase("J")){
System.out.println(" :");
Scanner sc=new Scanner(System.in);
String s=sc.nextLine();
System.out.println(" :");
Scanner sc1=new Scanner(System.in);
int key=sc1.nextInt();// int
Decrypt(s, key);//
}
}
public static void Encryption(String str,int k){//
String string="";
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(c>='a'&&c<='z'){//
c+=k%26;// key%26;
if(c<'a')
c+=26;
if(c>'z')
c-=26;
}else if(c>='A'&&c<='Z'){//
c+=k%26;// key%26;
if(c<'A')
c+=26;
if(c>'Z')
c-=26;
}
string+=c;//
}
System.out.println(str+" : "+string);
}
public static void Decrypt(String str,int n){//
int k=Integer.parseInt("-"+n);
String string="";
for (int i = 0; i < str.length(); i++) {
char c=str.charAt(i);
if(c>='a'&&c<='z'){//
c+=k%26;// key%26;
if(c<'a')
c+=26;
if(c>'z')
c-=26;
}else if(c>='A'&&c<='Z'){//
c+=k%26;// key%26;
if(c<'A')
c+=26;
if(c>'Z')
c-=26;
}
string+=c;//
}
System.out.println(str+" : "+string);
}
}
注意:アルファベットには26文字があり、シフト前に移動したビット数Keyと26を型抜きします.JAVAは文字に正の整数を加えると、アルファベット表で何桁右にシフトするかを表します.移動するビット数が負の場合は、アルファベットで左に何ビット移動するかを表します.
移動前に移動したビット数および26はモジュール化されているが、このようにして右シフトまたは左シフトを実現すると、依然として超境界が発生する.アルファベットxが4ビット右にシフトした場合はアルファベットbであるべきであるが、アルファベットxを4増加した後は26文字の範囲を超えている.もちろん、この場合のパスワードは意味がある(ASCコードテーブルの範囲を超えていない)可能性があり、ここでは明文は他のASCコードとして表される.この例は明文を26文字に表すだけなので、このときif文を2つ増やして判断し、左に境界(c<'a')を超えれば26を増やす.右に境界を超えた場合(c>'z')は26を減算します.また,大文字と小文字で境界を超えたか否かを判断する根拠が異なるため,プログラムでは文字を大文字と小文字に分けてそれぞれ処理する.