素晴らしい安全な旅行DESアルゴリズム(1)

みなさん、こんにちは。今日から、暗号化アルゴリズムに対称暗号化アルゴリズムを紹介します。誰もが以前の記事を読み、ダイジェストアルゴリズムの使用法をより深く理解していると思います。そのアルゴリズムの特性により、ダイジェストアルゴリズムは一方向にしか暗号化できず、データを逆に復号化することはできません。現時点では、対称暗号化アルゴリズムが表示されます。対称アルゴリズムには主にDES、3DES、AESが含まれますが、本日は対称暗号化アルゴリズムのDESアルゴリズムに焦点を当てます。

DESアルゴリズムの概要

DES(Data Encryption Standard)アルゴリズムは、世界で最も一般的に使用されている暗号化アルゴリズムです。長い間、多くの人が「パスワード生成」とDESを同義語と見なしていました。Electronic Frontier Foundationと呼ばれる組織は、後にDES暗号化データの解読を試みるために22万台相当のマシンを構築しましたが、これまでDESとそのバリアント3DES(Triple Data Encryption Algorithm)は政府や銀行で広く使用されています。

注:2001年に、AESアルゴリズムがDESアルゴリズムの代わりになりました。

米国国立標準局がDESを誕生させました

1973年5月、ニクソンの在任中に、米国国立標準局は、送信中にデータを保護するための暗号化アルゴリズムを要求する赤毛の文書を発行しました。国立標準局は誰も入札せずに長い間待っていましたが、ニクソンが辞任する3日前の1974年8月6日まで、IBMは独自に開発したコードネームLUCIFER(ゴールドスター)のセットを思いつきました。家。米国のセキュリティ機関による評価の後、1977年7月15日に、LUCIFERのバリアントがデータ暗号化標準DESとして採用されました。

DESは、電話回線の信号暗号化などの非デジタルメディアですぐに採用されました。当時、International Fragrance Organization IFFは、DESを使用して電話回線を介して送信される秘密のレシピを暗号化していました。(「データ暗号化を使用すると、IFFで香りは安全です」Computerworld 14、No。21、95 (1980))

同時に、政府に次ぐ暗号化の緊急の必要性として、銀行業界もDESを広く使用されている標準として使用しています。米国規格協会ANSIは、銀行業界全体の暗号化仕様を策定しました。1980年に採用されたANSIX3.92は、DESアルゴリズムの適用を指定しています。

DESアルゴリズムの機能

  • DES暗号化アルゴリズムは対称暗号化に属し、暗号化と復号化に同じキーが使用されます。

  • DES暗号化アルゴリズムでは、キーが8バイト、つまり64ビットの長さである必要があります。有効なキーの長さは56ビットで、各バイトの8番目のビットがパリティに使用されます。

  • キーはbyte [8]であるため、代表的な文字列は非表示のバイトにすることもでき、Base64エンコーディングアルゴリズムで使用できます。

  • 暗号化と復号化の両方を、データおよびキーとしてバイト配列を介して処理する必要があります。

  • DESアルゴリズムは、カオスと拡散という2つの暗号化テクノロジーを組み合わせたものです。最初に交換してから交換してください。

  • 実装が簡単で、DESアルゴリズムは標準の算術演算と論理演算のみを使用し、その関数の数は最大64ビットであるため、1970年代後半のハードウェアテクノロジを使用して簡単に実装できます。

DESアルゴリズムの長所と短所

利点:
  • 高効率、シンプルなアルゴリズム、低いシステムオーバーヘッド

  • 大量のデータの暗号化に適しています

  • 平文の長さは暗号文の長さと同じです

短所:
  • 安全な方法で鍵を交換する必要があります

  • 複雑なキー管理

DESアルゴリズムは高いセキュリティを備えています。これまでのところ、DESアルゴリズムを攻撃するための徹底的な検索方法を除けば、これ以上効果的な方法は見つかりませんでした。56ビットキーの完全なスペースは256です。つまり、コンピューターが毎秒100万個のキーを検出できる場合、すべてのキーを検索するのに2285年近くかかります。これを達成するのは難しいことがわかります。もちろん、科学技術の発展に伴い、超高速コンピュータが登場したときは、DESキーの長さを長くして機密性を高めることを検討できます。

DES暗号化の原則:

DESは、56ビットキーと追加の8ビットパリティビットを使用して、最大64ビットのパケットサイズを生成します。これは、暗号化されたテキストブロックが半分に分割されるFeistelと呼ばれる手法を使用する反復ブロック暗号です。サブキーを使用してラウンド関数をそれらの半分に適用し、次に出力を残りの半分と「排他的論理和」します。次に2つの半分を交換すると、プロセスは続行されますが、最後のサイクルは交換されません。DESは、排他的論理和、順列、置換、およびシフト演算の4つの基本演算を使用して、16サイクルを使用します。

DES暗号化プロセス
  1. 64ビットキーはサブキー生成アルゴリズムによって生成され、16個の48ビットサブキー(K1、K2、...、K16)を生成します。これらは、1番目、2番目、...、および16番目の暗号化に使用されます。それぞれ反復。

  2. 64ビットの平文は最初に最初の置換IPを受け、データはシャッフルされて再配置され、左半分と右半分に分割されます。左の32ビットはL0を形成し、右の32ビットはR0を形成します。

  3. i番目の暗号化の反復:サブキーKiはラウンド関数fによってRi-1を暗号化し、結果は32ビットのデータグループf(Ri-1、Ki)になります。f(Ri-1、Ki)がLi-1のモジュロ2に追加され、32ビットのデータグループLi-1⊕f(Ri-1、Ki)が取得されます。Li⊕f(Ri-1、Ki)を次の暗号化反復のRiとし、Ri-1を次の暗号化反復のLiとします(i = 1,2、...、16)。

  4. 前の手順のルールに従って、16回の暗号化の反復を実行します。

  5. 16回目の暗号化の反復が終了したら、R16を左側に、L16を右側にマージして、64ビットデータグループを生成します。逆初期置換IP-1の後、データが再配置され、64ビットの暗号文が取得されます。

DES復号化プロセス
  1. 64ビットキーは、サブキー生成アルゴリズムK1、K2、...、K16を介して16個の48ビットサブキーを生成します。これらは、それぞれ1回目、2回目、...、および16回目の復号化の反復に使用されます。

  2. 64ビット暗号文は最初に最初の置換IPを受け、データはシャッフルされて再配置され、左半分と右半分に分割されます。左32ビットはR16を形成し、右32ビットはL16を形成します。

  3. 17-i復号化の反復:サブキーKiはラウンド関数fによってLiを復号化し、結果は32ビットデータグループf(Li、Ki)になります。f(Li、Ki)に2を法とするRiが追加され、32ビットのデータグループRi⊕f(Li、Ki)が取得されます。Ri⊕f(Li、Ki)を次の復号化反復のLi-1として使用し、Liを次の復号化反復のLi-1として使用します(i = 16,15、...、1)。

  4. 前のステップのルールに従って、16回の復号化の反復を実行します。

  5. 16回目の復号化の反復が終了したら、L0を左側、R0を右側とし、マージして64ビットのデータグループを生成します。逆初期置換IP-1の後、データが再配置され、64ビットの平文が取得されます。

DESアルゴリズムの実装

対称暗号化アルゴリズムには、さまざまなグループ化モードとパディング方法があります。ここでは、グループ化モードECBとパディングモードNoPaddingを使用します。現在、この方法は比較的一般的なアプリケーションシナリオです。実装コード例は次のとおりです。

private static final String DES_ALGORITHM = "DES";

private static final String DES_CIPHER = "DES/ECB/NoPadding";

// des 加密
public static byte[] encryptDES(String data, String key) throws Exception {
    
    
    // 生成SecretKey对象
    SecretKey secretKey = desKeyGenerator(key);
    // Cipher对象实际完成加密操作
    Cipher cipher = Cipher.getInstance(DES_CIPHER);
    // 用密匙初始化Cipher对象
    cipher.init(Cipher.ENCRYPT_MODE, secretKey);
    // 执行加密操作
    return cipher.doFinal(data.getBytes());
}

// des 解密
public static byte[] decryptDES(byte[] data, String key) throws Exception {
    
    
    // 生成SecretKey对象
    SecretKey secretKey = desKeyGenerator(key);
    // Cipher对象实际完成解密操作
    Cipher cipher = Cipher.getInstance(DES_CIPHER);
    // 用密匙初始化Cipher对象
    cipher.init(Cipher.DECRYPT_MODE, secretKey);
    // 执行解密操作
    return cipher.doFinal(data);
}

/**
  * DES Key 生成方法
  *
  * @param key
  * @return
*/
private static SecretKey desKeyGenerator(String key) {
    
    
    try {
    
    
        // 创建一个DESKeySpec对象
        DESKeySpec desKey = new DESKeySpec(key.getBytes());
        // 创建一个密匙工厂
        SecretKeyFactory keyFactory = SecretKeyFactory.getInstance(DES_ALGORITHM);
        // 将DESKeySpec对象转换成SecretKey对象
        return keyFactory.generateSecret(desKey);
    } catch (InvalidKeyException e) {
    
    
        e.printStackTrace();
    } catch (NoSuchAlgorithmException e) {
    
    
        e.printStackTrace();
    } catch (InvalidKeySpecException e) {
    
    
        e.printStackTrace();
    }

    return null;
}

/**
  * Nopadding填充时,明文不是8位的倍数时需补足,这里补位0x00
  *
  * @param b
  * @return
  */
private static byte[] fillZero(byte[] b) {
    
    
    int len = b.length;

    //data不足8位以0补足8位
    if (b.length % 8 != 0) {
    
    
        len = b.length - b.length % 8 + 8;
    } else {
    
    
        return b;
    }
    byte[] needData = null;
    needData = new byte[len];
    for (int i = 0; i < len; i++) {
    
    
        needData[i] = 0x00;
    }
    System.arraycopy(b, 0, needData, 0, b.length);

    return needData;
}

完全なコードを表示するには、次のサイトにアクセスしてください。

https://github.com/ForTheDevelopers/JavaSecurity

アプリケーションシナリオ

DESアルゴリズムで最も一般的に使用されるシナリオは、銀行カードの受領、クレジットカード所有者のPINの暗号化された送信、ICカードとPOS間の双方向認証、金融取引データパケットのMAC検証などの銀行業界です。 。DESアルゴリズムが使用されます。また、DESアルゴリズムは、POS、ATM、磁気カード、スマートカード(ICカード)、ガソリンスタンド、高速道路の料金所などの分野でも広く使用されており、重要なデータの機密性を実現しています。

総括する

DESアルゴリズムとDESの実装は上記で紹介されています。3DESアルゴリズムはDESの変形であり、新しいアルゴリズムではありません。ここではあまり紹介しません。完全なソースコードをダウンロードして、実装方法を確認できます。対称暗号化アルゴリズムについては、対称暗号化のグループ化モードとパディングモードについては十分に説明していません。コードの実装にはグループ化とパディングも含まれますが、この部分については次のセクションで詳しく説明します。

DESアルゴリズムは解読される可能性がありますが、一部の金融システム、特に金融業界で働く人々では依然として広く使用されています。また、職場で遭遇したときにターゲットにできるように、すべての人が理解して習得する必要があります。

作成するのは簡単ではありません。この記事が気に入ったら、気に入って転送してください。あなたの注意は、私たちが前進する原動力です_

おすすめ

転載: blog.csdn.net/ForTheDevelopers/article/details/112645452