JavaのないCaesarとVigenereの実現に勝る

18847 ワード

1背景紹介では、現在「企業」として開発されている言語は、基本的に.NetとJ 2 EEの運用に集中しているという.また、ジェジュンは不幸にもJavaと「同流合汚」した.今思い出すと、本当に感慨深いですね.公瑾の年を懐かしんで、ジョーは初めて結婚して、雄姿英髪で、羽扇纶巾で、談笑の間に、強虜灰が飛んで煙が消えました.~ええと、次は本題を挿入します.実は、現在国内でJavaを使って本当の“企業級”をするのは実はそんなに多くなくて、ほとんどすべてSSHを使います
1これがJavaのエンタープライズクラスの開発だと思って、それから自慢し始めました.サーブレットとEJB 3の情をどうするかということですね~だから、現在の国内の多くのJavaの開発環境では、本当の武装が歯に届いているとは言えません.このような理由に基づいて、私たちはいくつかの“工事”をする时~、もちろん多くの情况に対してIDEメニューが“新しい工事”のこのようなオプションを选んで出てきた商品で、いくつかの応用に対して、いくつかの暗号化アルゴリズムを使う必要があって、Java自身は専门の暗号化ライブラリを持っていますが、しかしそれは确かに少し面倒で、しかも暗号化アルゴリズムは動的にロードされているので、ローカルテストでは問題は大きくありません.苦痛なのは、万が一サーバーに駆けつけて、この暗号化アルゴリズムのロードに失敗したりすると、これは大きなことです.何か認証システムとかといえば、それだけです.しかし、パスワードに対する要求が低いだけで、暗号化しないとだめな場合は、確かに面倒なことです.では,使いやすさ,実現性を考慮すると,それらのDESアルゴリズムはしばらく考慮されない.もし本当にこの需要があれば、丈夫性の高いDESを探す問題はまだ大きくないと信じています.多くの古典的な暗号化アルゴリズムの中で、Caesar暗号化は古典的である.したがって,このようなニーズに直面して,古典的な暗号化アルゴリズムを実現しようとする.
2Caesar暗号化アルゴリズムCaesar暗号化アルゴリズムは古典的な暗号化アルゴリズムの中で最も簡単である.標準的なCaesarでは,アルファベットシーケンスを一定数後ろに移動し,置換して暗号文を得るが,この数は固定値3である.すなわち,すべて英字からなるテキストでは,アルファベットAがDに置き換えられ,BがEに置き換えられるようになる.Caesar暗号化アルゴリズムにはいくつかの問題がある.まずこれが鍵としての値が固定されている3で、アルファベットが順番に並んでいるので、Caesarで暗号化されていることを相手が知っていれば、簡単に原文に脱密することができます.面倒ですが、これは原文とは差が少なく、加密要求が低くても低くはならないのではないでしょうか.そしてこの置換表は、アルファベットベースなので、英語ではアルファベットしか暗号化できないので、サポートされません.最後に,置換は固定されているので,同じアルファベットに対しても暗号化されたアルファベットは固定されている.例えば「AAA」というテキストを暗号化すると「DDD」になり、まだ人を惑わすには足りないように見えます.以上の理由から、私がここで実現したCaesarはいくつかの修正をしましたが、全体的な考え方はCaesarです.

 
  1. publicclassCaesar{
  2. privateStringtable;
  3. privateintseedA=1103515245;
  4. privateintseedB=12345;
  5. publicCaesar(Stringtable,intseed){
  6. this.table=chaos(table,seed,table.length());
  7. }
  8. publicCaesar(Stringtable){
  9. this(table,11);
  10. }
  11. publicCaesar(){
  12. this(11);
  13. }
  14. publicCaesar(intseed){
  15. this("ABCDEFGHIJKLMNOPQRSTUVWXYZ",seed);
  16. }
  17. publicchardict(inti,booleanreverse){
  18. ints=table.length(),index=reverse?s-i:i;
  19. returntable.charAt(index);
  20. }
  21. publicintdict(charc,booleanreverse){
  22. ints=table.length(),index=table.indexOf(c);
  23. returnreverse?s-index:index;
  24. }
  25. publicintseed(intseed){
  26. longtemp=seed;
  27. return(int)((temp*seedA+seedB)&0x7fffffffL);
  28. }
  29. publicStringchaos(Stringdata,intseed,intcnt){
  30. StringBufferbuf=newStringBuffer(data);
  31. chartmp;inta,b,r=data.length();
  32. for(inti=0;i<cnt;i+=1){
  33. seed=seed(seed);a=seed%r;
  34. seed=seed(seed);b=seed%r;
  35. tmp=buf.charAt(a);
  36. buf.setCharAt(a,buf.charAt(b));
  37. buf.setCharAt(b,tmp);
  38. }
  39. returnbuf.toString();
  40. }
  41. publicStringcrypto(booleanreverse,
  42. intkey,Stringtext){
  43. Stringret=null;
  44. StringBuilderbuf=newStringBuilder();
  45. intm,s=table.length(),e=text.length();
  46. for(inti=0;i<e;i+=1){
  47. m=dict(text.charAt(i),reverse);
  48. if(m<0)break;
  49. m=m+key+i;
  50. buf.append(dict(m%s,reverse));
  51. }
  52. if(buf.length()==e)
  53. ret=buf.toString();
  54. returnret;
  55. }
  56. publicStringencode(intkey,Stringtext){
  57. returncrypto(false,key,text);
  58. }
  59. publicStringdecode(intkey,Stringtext){
  60. returncrypto(true,key,text);
  61. }
  62. publicstaticvoidmain(String[]args){
  63. Caesarcaesar=newCaesar();
  64. Stringdata=caesar.encode(32,"APPLE");
  65. caesar.decode(32,data);
  66. }
  67. }
上記のCaesar実装では、鍵としての固定値3を整数で置き換えた.次に、この暗号化アルゴリズムの適用性は、異なる文字セットを転送することによってより広くすることができる.最後に,アルゴリズムクラスは初期化時に置換テーブルに対して1回のスクランブル操作を行うので,同じ置換テーブルでも初期化が伝わるseedによって暗号化された内容が異なる.プログラムの詳細については、ソースコードがより直感的に教えてくれると思います.
3Vigenere暗号化アルゴリズム実は、Vigenere暗号化アルゴリズムは歴史的な考証から見るとVigenereという人が発明したものではないようだ.多分、偶然の一致でVigenereという人に使われ、広まっただけで、Vigenere暗号化アルゴリズムと呼ばれています.その後、これはもともと美しい誤解だったことに気づいたが、すでに慣れている以上、口を変えるのは自然に難しいので、そのまま伝わってきた.ここまで言うと、Bellasoさんはまた涙を流しました.なぜ私はここでVigenereパスワードとCaesarを一緒に置くのですか?Vigenereはアップグレード版のCaesarアルゴリズムだからです.だから、当時そのCaesarが実現した後、BellasoさんとVigenereさんも、一緒に偲んでいました.VigenereはCaesarと比較してマルチテーブルの代替です.つまり、明文の異なる位置のアルファベットに対して、異なる代替テーブルを選択して暗号化します.上記の例では、異なる位置のアルファベットに対して、異なるkeyを選択して暗号化します.はっきり言って、複数のCaesarが重なるとVigenereです.Vigenereは暗号化の効果がCaesarより多く向上したとはいえ、Caesarに存在するいくつかの問題を補った.しかし、私の実現はやはりいくつかの小さな調整をしました.

 
  1. publicclassVigenere{
  2. privateStringtable;
  3. privateintseedA=1103515245;
  4. privateintseedB=12345;
  5. publicVigenere(Stringtable,intseed){
  6. this.table=chaos(table,seed,table.length());
  7. }
  8. publicVigenere(Stringtable){
  9. this(table,11);
  10. }
  11. publicVigenere(){
  12. this(11);
  13. }
  14. publicVigenere(intseed){
  15. this("ABCDEFGHIJKLMNOPQRSTUVWXYZ",seed);
  16. }
  17. privatechardict(inti,booleanreverse){
  18. ints=table.length(),index=reverse?s-i:i;
  19. returntable.charAt(index);
  20. }
  21. privateintdict(charc,booleanreverse){
  22. ints=table.length(),index=table.indexOf(c);
  23. returnreverse?s-index:index;
  24. }
  25. privateintseed(intseed){
  26. longtemp=seed;
  27. return(int)((temp*seedA+seedB)&0x7fffffffL);
  28. }
  29. publicStringchaos(Stringdata,intseed,intcnt){
  30. StringBufferbuf=newStringBuffer(data);
  31. chartmp;inta,b,r=data.length();
  32. for(inti=0;i<cnt;i+=1){
  33. seed=seed(seed);a=seed%r;
  34. seed=seed(seed);b=seed%r;
  35. tmp=buf.charAt(a);
  36. buf.setCharAt(a,buf.charAt(b));
  37. buf.setCharAt(b,tmp);
  38. }
  39. returnbuf.toString();
  40. }
  41. publicStringcrypto(booleanreverse,
  42. Stringkey,Stringtext){
  43. Stringret=null;
  44. StringBuilderbuf=newStringBuilder();
  45. intm,k,s=table.length(),
  46. e=text.length(),
  47. ke=key.length();
  48. for(inti=0;i<e;i+=1){
  49. m=dict(text.charAt(i),reverse);
  50. k=dict(key.charAt(i%ke),false);
  51. if(m<0||k<0)break;
  52. m=m+k+i;
  53. buf.append(dict(m%s,reverse));
  54. }
  55. if(buf.length()==e)
  56. ret=buf.toString();
  57. returnret;
  58. }
  59. publicStringencode(Stringkey,Stringtext){
  60. returncrypto(false,key,text);
  61. }
  62. publicStringdecode(Stringkey,Stringtext){
  63. returncrypto(true,key,text);
  64. }
  65. publicstaticvoidmain(String[]args){
  66. Vigenerevigenere=newVigenere();
  67. Stringdata=vigenere.encode("BELLASO","APPLE");
  68. vigenere.decode("BELLASO",data);
  69. }
  70. }
すなわち、Vigenere暗号化アルゴリズムによって入力された鍵は、数字ではなく文字列である.この文字列で使用される文字は、置換テーブルに表示される必要があります.総じて、Vigenereの強度はCaesarより少し強いです.しかし、結局は解読されます.ただし、Vigenereは、鍵の長さが明文の長さ以上であることを前提として、かなり強度の高い暗号化手段になる可能性があります.しかしながら、実際の応用では、この鍵は常に明文長よりも小さい.
4総じて言えば、この2つの暗号化アルゴリズムを理解するのは難しくない.暗号学の大牛にとって、これはまるで小児科だ.2つのアルゴリズムには共通の場所がたくさんありますが、いくつかの場所では少し違います.開発では、自分の好みに合わせて選ぶことができます.この2つの暗号化アルゴリズムがどれだけの耐解読強度を持つか期待しないでください.しかし、スモッグ弾として明文を隠すことはできます.しかし、この暗号化アルゴリズムを1組の明文暗号化を繰り返す場合は、自分でもう一度テストしたほうがいいです.暗号化回数が多くなると、強度の高い暗号文とは限らず、明文そのものになる可能性があるので、切記してください.また、もし私が暗号化したいのが中国語かバイナリデータであれば、中国語の文字セットを入れるなど、超大きな暗号表を作成するのではないかと思っている人もいるかもしれません.私が言いたいのは、この暗号化アルゴリズムの強度はあまり高くありません.もしあなたがこの需要がなければ、上体にアマニを着て、足に丁子のスリッパとパンツを着て、それもいいです.方法はBase 64であなたのデータをコードに回すことです.残りは64文字を含む変換テーブルを渡すことです.「=」記号は暗号化しないことをお勧めします.私のテーマで言ったように、話はないよりましだ.時々、パンツをはいて出かけるのは、少しもかけないよりいいです.前者は、あまり文明的ではないと言われることが多い.後者は、お茶をごちそうされるに違いない.私がこの2つのパスワードを実現する最も主要な現実的な意義もここにあります.最後に、文章の末尾を見てくれてありがとう.もし何か疑問や考えがあれば、私に教えてほしいです.私も喜んであなたと交流します.