ブロックチェーン教程ブロックチェーンの背後にある情報セキュリティ2 DES、3 DES暗号化アルゴリズムの原理一


ブロックチェーン教程ブロックチェーンの背後にある情報セキュリティ2 DES、3 DES暗号化アルゴリズムの原理1、2018年下半期、ブロックチェーン業界は発展当初の浮躁、理性に戻りつつあり、表面的には関連人材の需要と価格が下落しているようだ.しかし、実際には、初期バブルの漸退こそ、ブロックチェーンの本当の技術に注目されている.
DES、3 DES暗号化アルゴリズムの原理とそのGO言語の実現
DES暗号化アルゴリズムは、対称暗号化アルゴリズムの一種である.70年代初めにIBMによって開発され、その後1977年にアメリカ国家標準局によってデータ暗号化標準として採用された.すなわちDESの全称の由来:Data Encryption Standard.対称暗号化アルゴリズムは、非対称暗号化アルゴリズムに対して使用される.両者の違いは、対称暗号化は、暗号化および復号化の際に同じ鍵を使用し、対称暗号化ではなく、暗号化および復号化の際に異なる鍵、すなわち公開鍵および秘密鍵を使用することである.一般的なDES、3 DES、AESは対称暗号化アルゴリズムであり、RSA、楕円曲線暗号化アルゴリズムは非対称暗号化アルゴリズムである.
DESは64ビットの明文を1単位として暗号化され、64ビットを超えるデータは、固定された64ビットのサイズでグループ化されることが要求され、グループには多くのパターンがあり、その後は単独でまとめられ、しばらくDES暗号化アルゴリズムを紹介する.DESが使用する鍵の長さは64ビットであるが、7ビット毎にパリティビットが設定されているため、鍵の長さは実際には56ビットである.パリティは最も簡単なエラー検出コードであり、すなわち、バイナリコードのセットの1の個数が奇数または偶数であることに基づいてエラーを検出する.
Feistelネットワーク
DESの基本構造は、IBM社のHorst Feistelによって設計されているため、Feistelネットワークと呼ばれています.Feistelネットワークでは,暗号化の各ステップをホイールと呼び,初期置換後の64ビット明文を経て16ラウンドFeistelホイールの暗号化過程を行い,最後に置換終了後に最終的な64ビット暗号文を形成した.
64ビットの明文は左、右の2つの部分処理に分けられ、右側のデータとサブキーは輪関数fを介して左側のデータを暗号化するためのビットシーケンスを生成し、左側のデータと異なるか演算し、演算結果は暗号化後の左側に出力され、右側のデータは直接右側に出力される.その中性子鍵は今回の暗号化で使用される鍵であり,Feistelのたびに異なるサブ鍵が使用される.サブキーの計算、およびホイール関数の詳細については、後述します.一度のFeistelホイールでは右側が暗号化されないため、前回出力後の左右両側を合わせてFeistelホイールのプロセスを繰り返す必要があり、DESアルゴリズムでは合計16回のFeistelホイールを行い、最終ラウンド出力後の左右両側を合わせる必要はありません.
DES暗号化と復号化のプロセスは一致しており,いずれもFeistelネットワークを用いて実現されているが,復号化時にのみ暗号文が入力として用いられ,逆順序でサブ鍵が用いられるという違いがある.
go標準ライブラリにおけるDESアルゴリズムは以下のように実現される.
func cryptBlock(subkeys []uint64, dst, src []byte, decrypt bool) {
    b := binary.BigEndian.Uint64(src)
    //    
    b = permuteInitialBlock(b)
    left, right := uint32(b>>32), uint32(b)

    var subkey uint64
    //  16 feistel 
    for i := 0; i < 16; i++ {
        //              
        if decrypt {
            subkey = subkeys[15-i]
        } else {
            subkey = subkeys[i]
        }
        //feistel   
        left, right = right, left^feistel(right, subkey)
    }
    //        
    preOutput := (uint64(right) << 32) | uint64(left)
    //    
    binary.BigEndian.PutUint64(dst, permuteFinalBlock(preOutput))
}
//    src/crypto/des/block.go

初期ディスプレイスメントと終了ディスプレイスメント
Feistelホイールに入る前に、64ビットの明文は初期置換を行う必要があります.Feistelホイールが終了したら、反転操作、すなわち置換を終了する必要があります.初期ディスプレイスメントと終端ディスプレイスメントの目的は、ハードウェアの解読の難易度を強化するために加えられたものである.
付go標準ライブラリで使用される初期置換テーブルと終了置換テーブルは以下の通りです.
//     
var initialPermutation = [64]byte{
    6, 14, 22, 30, 38, 46, 54, 62,
    4, 12, 20, 28, 36, 44, 52, 60,
    2, 10, 18, 26, 34, 42, 50, 58,
    0, 8, 16, 24, 32, 40, 48, 56,
    7, 15, 23, 31, 39, 47, 55, 63,
    5, 13, 21, 29, 37, 45, 53, 61,
    3, 11, 19, 27, 35, 43, 51, 59,
    1, 9, 17, 25, 33, 41, 49, 57,
}

//     
var finalPermutation = [64]byte{
    24, 56, 16, 48, 8, 40, 0, 32,
    25, 57, 17, 49, 9, 41, 1, 33,
    26, 58, 18, 50, 10, 42, 2, 34,
    27, 59, 19, 51, 11, 43, 3, 35,
    28, 60, 20, 52, 12, 44, 4, 36,
    29, 61, 21, 53, 13, 45, 5, 37,
    30, 62, 22, 54, 14, 46, 6, 38,
    31, 63, 23, 55, 15, 47, 7, 39,
}
//    src/crypto/des/const.go

サブキーの計算
DES初期鍵は64ビットであり、そのうち8ビットがパリティに用いられ、実際の鍵は56ビットであり、64ビットの初期鍵がPC−1鍵で置換された後、56ビット列が生成される.PC-1置換後56ビットの列は、左右の2つの部分に分かれ、各28ビットずつ左に1ビットシフトし、C 0とD 0を形成し、C 0とD 0を合わせて56ビットとし、PC-2置換後48ビット鍵K 0を生成する.C 0とD 0はそれぞれ1ビット左シフトし、C 1とD 1を形成し、C 1とD 1を合わせて56ビットとなり、PC−2置換後にサブキーK 1を生成する.このようにして、サブキーK 15が生成されるまで行う.しかし、各サイクルの左シフトの桁数に注意してください.以下の規定があります.
var ksRotations = [16]uint8{1, 1, 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 1}
//    src/crypto/des/const.go

go標準ライブラリのDESサブキー計算のコードは以下の通りです.
func (c *desCipher) generateSubkeys(keyBytes []byte) {
    key := binary.BigEndian.Uint64(keyBytes)
    //PC-1    ,  56  
    permutedKey := permuteBlock(key, permutedChoice1[:])

    //56        , 28 ,ksRotate       1 
    leftRotations := ksRotate(uint32(permutedKey >> 28))
    rightRotations := ksRotate(uint32(permutedKey<<4) >> 4)

    //     
    for i := 0; i < 16; i++ {
        //       ,  PC-2  
        pc2Input := uint64(leftRotations[i])<<28 | uint64(rightRotations[i])
        c.subkeys[i] = permuteBlock(pc2Input, permutedChoice2[:])
    }
}
//    src/crypto/des/block.go

go標準ライブラリで使用するPC-1置換テーブルとPC-2置換テーブルを添付します.
//PC-1   
var permutedChoice1 = [56]byte{
    7, 15, 23, 31, 39, 47, 55, 63,
    6, 14, 22, 30, 38, 46, 54, 62,
    5, 13, 21, 29, 37, 45, 53, 61,
    4, 12, 20, 28, 1, 9, 17, 25,
    33, 41, 49, 57, 2, 10, 18, 26,
    34, 42, 50, 58, 3, 11, 19, 27,
    35, 43, 51, 59, 36, 44, 52, 60,
}

//PC-2   
var permutedChoice2 = [48]byte{
    42, 39, 45, 32, 55, 51, 53, 28,
    41, 50, 35, 46, 33, 37, 44, 52,
    30, 48, 40, 49, 29, 36, 43, 54,
    15, 4, 25, 19, 9, 1, 26, 16,
    5, 11, 23, 8, 12, 7, 17, 0,
    22, 3, 10, 14, 6, 20, 27, 24,
}
//    src/crypto/des/const.go

未完待続感謝兄弟連ブロックチェーンチュートリアル共有!