Javascriptはプレイフェアとヒルのパスワードアルゴリズムを実装_基礎知識

WBOY
リリース: 2016-05-16 16:28:36
オリジナル
1638 人が閲覧しました

学期の終わりまでに、情報セキュリティ入門の宿題を勉強してください。古典的な暗号アルゴリズムの中で、たまたま Playfair アルゴリズムと Hill アルゴリズムを見つけたので、それを JavaScript 言語で実装するのが興味深く、コーディング中に Baidu を調べて、ちなみに JavaScript の基礎を学びました。

プレイフェア

プレイフェア暗号(英語: Playfair cipher または Playfair square)は、代替暗号です。これは、5*5 の正方形で構成されるパスワード テーブルに基づいて記述され、テーブル内に 25 文字が配置されます。英語の 26 文字から、最も一般的に使用される Z が削除されて、パスワード テーブルが形成されます。

実装のアイデア:

1. パスワードテーブルを準備します

キーは単語または語句であり、パスワード テーブルはユーザーが指定したキーに基づいてコンパイルされます。文字が重複している場合は、それ以降の重複文字を削除できます。

キーがクレイジードッグの場合は、

にコンパイルできます。

C
H
T
R
G
N
A
B
J
V
Y
E
K
Q
W
D
F
L
S
X

コードをコピーします コードは次のとおりです:

/*
* 機能: パスワードテーブルの作成
*
* パラメータ: キー (スペースを削除して大文字にした後)
*
* 戻り値: パスワードテーブル
*/
function createKey(keychars){
//アルファベット配列
var allChars = ['A','B','C','D','E','F','G','H','I','J','K','L '、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、'U'、'V'、'W'、'X'、 'Y'];
//変数 keychars はアルファベット順テーブル内の文字の位置を取得し、文字
を削除します for(var i = 0 ;i varindex = allChars.indexOf(keychars[i]);
If (インデックス > -1) {
allChars.splice(index, 1);
}
}
//keychar の文字をアルファベットに挿入します
for(var i = keychars.length-1;i>=0;i--){
allChars.unshift(keychars[i]);
}
//キー文字を最初の列からパスワードテーブルに挿入します
for(var i = 0; i for(var j = 0; j key[j][i] = allChars[i*5 j];
}
}
}

パスワード テーブルにキー文字を挿入するときに、重複する文字と Z を削除する必要があることを考慮してください。設計アルゴリズムは次のとおりです。

コードをコピーします コードは次のとおりです:

/*
* 機能: 文字列内の繰り返し文字を削除
*
* パラメータ: 処理が必要な文字列
*
* 戻り値: 処理された文字列
*/
関数removeDuplicate(str){
var result = [],tempStr = "";
var arr = str.split('');//文字列を配列に分割します
//arr.sort();//ソート
for(var i = 0; i varrepeatBack = true;//次のアルゴリズムは同じ文字が互いに接続されていることを確認することしかできないため、設計変数は文字列の先頭部分に同じ文字が存在しないことを保証することです
for(var j = 0;j If(arr[i] == result[j])
repeatBack = false;
}
If(arr[i] !== tempStr &&repeatBack){
result.push(arr[i]);
tempStr = arr[i];
}その他{
続行;
}
}
return result.join("");//配列を文字列に変換します
}

2. プレーンテキストを整理する

平文の 2 文字ごとのペアを形成します。同じ文字が 2 つ隣り合ってペアになっている場合、または最後の文字が 1 文字の場合は、X を挿入します。最初のコーディングが思慮深くなく、ユーザーが奇数の文字の入力を強制的に拒否したため、ユーザー エクスペリエンスが低下しました。

var k = document.getElementById("keychars").value.toUpperCase().replace(/s/ig,'');
スペースを削除し、プレーン テキストを大文字に変換します。

3. 暗号文を書き込む

平文暗号化ルール (Baidu より):

1) p1 と p2 が同じ行にある場合、対応する暗号文 c1 と c2 は、p1 と p2 のすぐ右側の文字になります。最初の列は最後の列の右側にあるとみなされます。たとえば、前の表によれば、ct は oc
に対応します。 2) p1 と p2 が同じ列にある場合、対応する暗号文 c1 と c2 は、p1 と p2 のすぐ下の文字です。最初の行は最後の行の下にあるとみなされます。
3) p1 と p2 が同じ行または列にない場合、c1 と c2 は、p1 と p2 によって決定される長方形の他の 2 つの隅にある文字になります (水平置換または垂直置換については、次の点で指定する必要があります)。先に進むか、自分で試してください)。前の表によると、wh は tk または kt に対応します。

たとえば、上の表によると、平文には生命があり、希望があります。
それは、自分がどこにいるのか、店の例のように整理できます
その場合、暗号文は次のようになります: kt yg wo ok gy nl hj of cm yg kg lm mb wf
暗号文を大文字に変換し、文字をグループに配置します。
たとえば、5 人のグループは KTYGW OOKGY NLHJO FCMYG KGLMM BWF
です。
4. 復号化
キーは 5*5 の行列に埋められます (繰り返しの文字と文字 z が削除されます)。行列内の他の未使用の文字が行列の残りの位置に順番に埋められます。平文は置換行列に従って暗号文から取得されます。 。逆のことをしてください。

効果は図に示すとおりです。

Hill Password は、基本的な行列理論の原理を使用する換字式暗号です。これは、5*5 の正方形で構成されるパスワード テーブルに基づいて記述され、テーブル内に 25 文字が配置されます。英語の 26 文字から、最も一般的に使用される Z が削除されて、パスワード テーブルが形成されます。

実装のアイデア:

1、アルファベットを書きます
var chars = ['A','B','C','D','E','F','G','H','I','J','K','L '、'M'、'N'、'O'、'P'、'Q'、'R'、'S'、'T'、'U'、'V'、'W'、'X'、 'Y','Z'];
2. ランダムにキーを生成

コードをコピーします コードは次のとおりです:

/*
* 機能: ランダムにキーを生成
*
* 戻り値: キー行列
*/
関数randomCreateKey(){
// 0 から 26 までの数値をランダムに生成します
for(var i = 0;i for(var j = 0;j key[i][j] = Math.round(Math.random()*100&)
}
}
}

3. キー コードは、自動生成されたキーに基づいてプレーン テキストを処理します:

コードをコピー コードは次のとおりです:

/*
* 関数: ヒルアルゴリズム
*
* パラメータ: 長さが 3 の倍数である大文字の配列
*
* 戻り値: 暗号化された文字列
*/
関数hill(p){
//大文字暗号文
var res = "";
//文字列を走査する必要がある合計回数を決定します
varround = Math.round(p.length/3);
//処理中
for(var b = 0;b //プレーンテキスト 3
var temp3 ="";
var tempArr3 = [];
var sumArr3 = [];
for(var i = 0;i temp3 = p.shift();
for(var j = 0;j If(temp3[i] == chars[j])
tempArr3[i] = j;
}
}
                                                                                                                                                            for(var i =0;i for(var j = 0;j sumArr3[i] = (tempArr3[j]*key[i][j])&;
}
}
// アルファベットの文字の対応するインデックスを取得します
for(var i =0;i res = chars[sumArr3[i]];
}
}
応答を返します;
};

効果は図のとおりです。

上記のアルゴリズムには次の欠点があります:

1. プロセス指向の設計、高結合

2. ネストされたループが多すぎるため、アルゴリズムの効率を最適化する必要があります

3. ユーザーがアルファベット以外の文字を入力した場合に処理されないなど、起こり得る状況への考慮が不十分です。

概要:

情報セキュリティ入門コースをしばらく勉強した後、情報セキュリティの表面をなぞっただけです。情報セキュリティは非常に興味深いテーマです。問題が発生した場合は、可能な限り考え、可能な限り実行し、可能な限り適用する必要があります。同時に数学的基礎の蓄積を強化し、jsの基礎を固め、知識を広げることも必要です。これからの道は長くて険しいです。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート