暗号化アルゴリズム
DESはフルネームデータ暗号化標準であり、キー暗号化を使用するブロックアルゴリズムです。 1976年に米国連邦政府国家標準局によって連邦データ処理基準(FIPS)として決定され、後に国際的に広く流通しました。
DESアルゴリズムには、キー、データ、モードの3つのエントリパラメーターがあります。そのうち、キーは7バイト、合計56ビットです。これは、DESアルゴリズムの動作キーです。データは8バイト、合計64ビットで、暗号化または復号化されるデータです。モードは、DES:暗号化または復号化の動作モードです。
DESアルゴリズムは、64ビットのプレーンテキスト入力ブロックを64ビットの暗号文出力ブロックに変換します。使用するキーは56ビットです。そのアルゴリズムは、主に2つのステップに分かれています。
1)初期順列関数は、入力64ビットデータブロックをビットで再結合し、出力をL0とR0の2つの部分に分割することです。各部分は長さ32ビットです。順列ルールは、入力の58ビットを最初のビットに、50番目のビットを2番目のビットに切り替えることです...など、最後のビットは元の7ビットです。 L0とR0は、転置出力後の2つの部分、L0は出力の左32ビット、R0は右32ビットです。例:D1D2D3 ... D64に転置する前に入力値を設定し、初期順列の後の結果は次のとおりです。L0= D58D50 ... D8; R0 = D57D49 ... D7。
交換ルールを次の表に示します。
58,50,42,34,26,18,10,2,60,52,44,36,28,20,12,4,62,54,46,38,30,22,14,6,64,56,48,40,32,24,16,8.8 、57,49,41,33,25,17,9,1,59,51,43,35,19,11,3,61,53,45,37,29,21,13,5,63,55,47,39,31,31,23,7、
2)16回の反復操作の後、L16およびR16が取得されます。これを入力として受け取り、逆順列を実行します。逆順列は、まさに初期順列の逆動作であり、それによって暗号文化出力が得られます。
このアルゴリズムは、対称暗号化アルゴリズムシステムの代表であり、コンピューターネットワークシステムで広く使用されています。
基本的なJava実装
パッケージcom.stone.security; java.security.keyをインポートします。 java.security.securerandomをインポートします。 javax.crypto.cipherをインポートします。 javax.crypto.keygeneratorをインポートします。 javax.crypto.secretkeyをインポートします。 javax.crypto.secretkeyFactoryをインポートします。 javax.crypto.spec.deskeyspecをインポートします。 javax.crypto.spec.ivparameterspecをインポートします。 / *** DES ALGORITHM 1972米国でIBMによって開発されたSymmetric Encryption Algorithm*/ public class des {// algorithm name public static final string key_algorithm = "des"; //アルゴリズム名/暗号化モード/充填方法public static final string cipher_algorithm_ecb = "des/ecb/pkcs5padding"; public static final string cipher_algorithm_cbc = "des/cbc/pkcs5padding"; public static void main(string [] args)スロー例外{ / * * ecbモード *キージェネレーターを使用してキー * ecbモードはiv * / byte [] key = generatekey()を使用できません。 byte [] encrypt = encrypt( "gasculitis f#*(x)"。getbytes()、key); system.out.println(new String(decrypt(encrypt、key))); / * * CBCモードを使用 *キーファクトリーを使用して、キー、暗号化、復号化 * IV:DES IN CBCモードとOAEPエンコード操作を備えたRSA暗号を生成します。 */ deskeyspec dks = new deskeyspec(generatekey()); SecretKeyFactory Factory = SecretKeyFactory.getInstance(key_algorithm); SecretKey SecretKey = Factory.GenerateCret(dks); cipher cipher = cipher.getInstance(cipher_algorithm_cbc); cipher.init(cipher.encrypt_mode、secretkey、new ivparameterspec(getiv())); byte [] enc = cipher.dofinal( "gasculitis a%f#*(x)"。getbytes()); // cipher.init(cipher.decrypt_mode、secretkey、new ivparameterspec(getiv())); byte [] dec = cipher.dofinal(enc); // decrypt system.out.println(new String(dec)); } static byte [] getiv(){string iv = "asdfivh7"; // IVの長さ:8バイトの長さのreturn iv.getBytes()でなければなりません。 } / ** * generate key * * @return * @throws例外 * / private static byte [] generatekey()throws exception {keygenerator keygenerator = keygenerator.getInstance(key_algorithm); keygenerator.init(56); // desは56である必要があります。この最初の方法は、secretkey secretkey = keygenerator.genertykey()を呼び出す必要はありません。 SecretKey.getEncoded()を返します。 } / ** *キーを復元 * * @param key * @return * @throws例外 * / private static key tokey(byte [] key)throws exception {deskeyspec des = new deskeyspec(key); SecretKeyFactory keyFactory = secretKeyFactory.getInstance(key_algorithm); SecretKey SecretKey = KeyFactory.GenerateCret(des); SecretKeyを返します。 } / *** encrypt* @param data original text* @param key* @return ciphertext* @throws例外* / public static byte [] encrypt(byte [] data、byte [] key)throws {key k = tokey(key); cipher cipher = cipher.getInstance(cipher_algorithm_ecb); cipher.init(cipher.encrypt_mode、k、new Securerandom()); cipher.dofinal(data)を返します。 } / *** decrypt* @param data password* @param key* @return平野テキスト、オリジナルテキスト* @throws例外* / public static byte [] decrypt(byte [] data、byte [] key)throws exception {key k = tokey(key); cipher cipher = cipher.getInstance(cipher_algorithm_ecb); cipher.init(cipher.decrypt_mode、k、new Securerandom()); cipher.dofinal(data)を返します。 }} Java TripleDES実装:
パッケージcom.stone.security; javax.crypto.cipherをインポートします。 javax.crypto.keygeneratorをインポートします。 javax.crypto.secretkeyをインポートします。 javax.crypto.secretkeyFactoryをインポートします。 javax.crypto.spec.desedekeyspecをインポートします。 javax.crypto.spec.ivparameterspecをインポートします。 / ** *トリプル暗号化3DESは、トリプルデスとしても使用されます */ public class triptledes {// algorithm name public static final string key_algorithm = "dede"; //アルゴリズム名/暗号化モード/充填方法public static final string cipher_algorithm_ecb = "desede/ecb/pkcs5padding"; public static final string cipher_algorithm_cbc = "desede/cbc/pkcs5padding";秘密のkeygenerator keygen; Private SecretKey SecretKey; Private SecretKey SecretKey2;プライベート暗号の暗号。 private static byte [] encryptData; public static void main(string [] args)スロー例外{tripleledes riptledes = new riptledes( "ecb"); tripledes.encrypt( "sau8jzxlcvm、 '123`98(*^&%^^ jcb zx >> a <s <}} {"); system.out.println( "and new string(triptledes.decrypt(encryptdata))); tretledes = new tretledes(" cbc "); tripledes.encrypt2( "sau8jzxlc dqv#> <«| vm、 '123`98(*^&%^^ jcb zx >> a <s <}} {"); println( "encryption:" + new String(encryptdata)); string(decrypt2(encryptdata)) keygenerator.getInstance(key_algorithm); desedekeyspec(keygen.genertykey()。 cipher.init(cipher.encrypt_mode、secretkey); return encryptdata = cipher.dofinal(str.getbytes()); } / ** * decrypt * @param encrypt * @return * @throws Exception * / public byte [] decrypt(byte [] encrypt)throws exception {cipher.init(cipher.decrypt_mode、secretkey); return encryptdata = cipher.dofinal(encrypt); } byte [] getiv(){return "administ" .getBytes(); } / ** * encrypt * @param str * @return * @throws例外 * / public byte [] encrypt2(string str)throws exception {cipher.init(cipher.encrypt_mode、secretkey2、new ivparameterspec(getiv()); return encryptdata = cipher.dofinal(str.getbytes()); } / ** * decrypt * @param encrypt * @return * @throws例外 * / public byte [] decrypt2(byte [] encrypt)throws {cipher.decrypt_mode、secretkey2、new ivparameterspec(getiv()); return encryptdata = cipher.dofinal(encrypt); }}