Java Language——データ暗号化アルゴリズムと符号化方式

27665 ワード

データ暗号化はコンピュータシステムが情報を保護する最も信頼できる方法である.暗号技術を利用して情報を暗号化し、情報隠蔽を実現し、情報の安全を保護する役割を果たす.本文は主にいくつかの一般的なデータ暗号化アルゴリズム(対称暗号アルゴリズム/非対称暗号アルゴリズム)のJava実装と一般的な符号化方式の使用を紹介した.
1.対称暗号化アルゴリズム
対称暗号化とは、同じ鍵を使用して暗号化および復号化される暗号化アルゴリズムを指す.一般的な対称暗号化アルゴリズムには、次のものがあります.
アルゴリズム#アルゴリズム#
説明
鍵の長さ
デフォルトの鍵の長さ
動作モード
じゅうてんほうしき
デフォルトの塗り方
インプリメンテーションモード
DES
データ暗号化基準
56bit
56bit
ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128
NoPadding、PKCS5Padding、ISO10126Padding
PKCS5Padding
JDK
3DES
三重DES暗号化のアルゴリズムを行った
112bit、168bit
168bit
ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128
NoPadding、PKCS5Padding、ISO10126Padding
PKCS5Padding
JDK
AES(推奨使用)
高度なデータ暗号化基準、AESアルゴリズムはDESに対する攻撃アルゴリズムを効果的に抵抗することができる
128bit、192bit、256bit
128bit
ECB、CBC、PCBC、CTR、CTS、CFB、CFB8-CFB128、OFB、OFB8-OFB128
NoPadding、PKCS5Padding、ISO10126Padding
PKCS5Padding
JDK
1.AESアルゴリズム
Javaは、鍵の確立時間が短く、感度がよく、メモリの需要が低く、セキュリティが高いことを実現します.AESアルゴリズムCBCモードを選択することで、セキュリティを向上させることができます.
1、鍵の生成
KeyGenerator keyGen = KeyGenerator.getInstance("AES");       //      
keygen.init(128);                                            //   128,           192 256
SecretKey secretKey = keyGen.generateKey();                  //     
byte[] enCodeFormat = secretKey.getEncoded();                //       

2、定義16 byte IV
private static final byte[] IV_BYTES = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
            0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01};

3、AES-CBC暗号化
IvParameterSpec iv = new IvParameterSpec(IV_BYTES);
SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");      // key:   
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  //    
cipher.init(Cipher.ENCRYPT_MODE, sKeySpec, iv);              //  Cipher   ,     
byte[] result = cipher.doFinal(value.getBytes("UTF-8"));     // value:         , result:       

4、AES-CBC解読
IvParameterSpec iv = new IvParameterSpec(IV_BYTES);
SecretKeySpec sKeySpec = new SecretKeySpec(key, "AES");      // key:   
Cipher cipher = Cipher.getInstance("AES/CBC/PKCS5Padding");  //    
cipher.init(Cipher.DECRYPT_MODE, sKeySpec, iv);              //  Cipher   ,     
String result = new String(cipher.doFinal(value), "UTF-8");  // value:             , result:       

2.非対称暗号化アルゴリズム
非対称暗号化アルゴリズムは鍵に基づく秘密保持方法であり、公開鍵とプライベート鍵が必要であり、ファイル暗号化、特にネットバンクに広く応用されている.非対称暗号アルゴリズムは対称暗号アルゴリズムよりも安全である.一般的な非対称暗号化アルゴリズムには、次のものがあります.
アルゴリズム#アルゴリズム#
説明
鍵の長さ
デフォルトの鍵の長さ
動作モード
じゅうてんほうしき
インプリメンテーションモード
DH
鍵交換アルゴリズム
512~1024(64の整数倍)
1024
なし
なし
JDK
RSA(推奨使用)
ファクタ分解に基づいて、データ暗号化とデジタル署名に使用
512~65536(64の整数倍)
1024
ECB
NoPadding、PKCS1Padding、OAEPWITHMD5AndMGF1Padding、OAEPWITHSHA1AndMGF1Padding、OAEPWITHSHA256AndMGF1Padding、OAEPWITHSHA384AndMGF1Padding、OAEPWITHSHA512AndMGF1Padding
JDK
2048
NONE
NoPadding、PKCS1Padding、OAEPWITHMD5AndMGF1Padding、OAEPWITHSHA1AndMGF1Padding、OAEPWITHSHA224AndMGF1Padding、OAEPWITHSHA256AndMGF1Padding、OAEPWITHSHA384AndMGF1Padding、OAEPWITHSHA512AndMGF1Padding、ISO9796-1Padding
BC
ElGamal
離散対数に基づいて,公開鍵暗号化アルゴリズムのみが提供され,秘密鍵は暗号化できない.
160~16384(8の整数倍)
1024
ECB、NONE
「上記RSAのBC実装と同様」
BC
ECC
だえんきょくせん暗号化
1.RSAアルゴリズム
初期化キー:
KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA"); //      
keyPairGenerator.initialize(1024);                                       //   1024
KeyPair keyPair = keyPairGenerator.generateKeyPair();                    //     
RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();          //     
RSAPrivateKey rsaPrivateKey =  (RSAPrivateKey) keyPair.getPrivate();     //     

公開鍵はクライアントに送信され、秘密鍵はサービス側に格納される必要がある.
1、秘密鍵暗号化、公開鍵復号
サービス側秘密鍵の暗号化:
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); // rsaPrivateKey:  
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");                   //    
cipher.init(Cipher.ENCRYPT_MODE, privateKey);                //  Cipher   ,     
byte[] result = cipher.doFinal(inStr.getBytes("UTF-8"));     // inStr:         , result:       

クライアント公開鍵の復号化:
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); // rsaPublicKey:  
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");                   //    
cipher.init(Cipher.DECRYPT_MODE, publicKey);                 //  Cipher   ,     
String result = new String(cipher.doFinal(inByte), "UTF-8"); // inByte:             , result:      

2、公開鍵の暗号化、秘密鍵の復号
クライアント公開鍵の暗号化:
X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); //rsaPublicKey:  
keyFactory = KeyFactory.getInstance("RSA");
PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");                   //    
cipher.init(Cipher.ENCRYPT_MODE, publicKey);                 //  Cipher   ,     
byte[] result = cipher.doFinal(inStr.getBytes("UTF-8"));     // inStr:         , result:       

サービス側秘密鍵の復号化:
PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); // rsaPrivateKey:   
KeyFactory keyFactory = KeyFactory.getInstance("RSA");
PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
Cipher cipher = Cipher.getInstance("RSA");                   //    
cipher.init(Cipher.DECRYPT_MODE, privateKey);                //  Cipher   ,     
String result = new String(cipher.doFinal(inByte), "UTF-8"); // inByte:             , result:       

3.符号化方式
1.Base 64符号化
Base 64は、ネットワーク上で最も一般的な8ビットバイトコードを伝送するための符号化方式の1つである.Base 64は暗号化アルゴリズムではなく符号化方式であり、暗号化後はbyte[]であるため、可読性のためにbyte[]をbase 64符号化に変換するのが一般的である.最も簡単な使用方法は、次のMaven依存性を追加することです.
<dependency>
    <groupId>commons-codecgroupId>
    <artifactId>commons-codecartifactId>
    <version>1.11version>
dependency>

commons-codecは、Apacheオープンソース組織が提供する要約演算、符号化のためのパケット(JDKの簡略化)である.Base 64の符号化と復号化の方法は以下の通りである.
//   ,inStr:        
String result = new String(Base64.encodeBase64(inStr.getBytes()), "UTF-8");
//   ,inStr:        
String result = new String(Base64.decodeBase64(inStr.getBytes()), "UTF-8");

カスタムBase 64エンコーディング:
2.URLコード
URL符号化(URL encoding)は、パーセンテージ符号化(Percent-encoding)とも呼ばれ、特定のコンテキストの統一リソースロケータ(URL)の符号化メカニズムである.HTTPのリクエスト操作(request)によってHTMLフォームデータを送信するために使用されるため、統合リソース識別子(URI)の符号化にも使用されます.
URLの符号化と復号化の方法は以下の通りである.
//   , inStr:         
String result = URLEncoder.encode(inStr, "UTF-8");
//   , inStr:         
String result = URLDecoder.decode(inStr, "UTF-8");

4.メッセージ要約アルゴリズム
メッセージ要約アルゴリズムは、データの整合性を検証するために現れ、デジタル署名の核心アルゴリズムである.一般的なメッセージ要約アルゴリズムには、次のものがあります.
アルゴリズム#アルゴリズム#
説明
サマリーの長さ
アルゴリズムを含める
インプリメンテーションモード
適用シーン
MD
メッセージの概要、不可逆暗号化
128
MD2、MD4、MD5
JDK(MD2、MD5)、BC(MD4)
ユーザー登録時にパスワードを暗号化
SHA
セキュアハッシュアルゴリズム、固定長要約情報、不可逆暗号化
SHA-1(160)、SHA-224(224)、SHA-256(256)、SHA-384(384)、SHA-512(512)
SHA-1、SHA-2(SHA-224、SHA-256、SHA-384、SHA-512)
JDK(SHA-1、SHA-256、SHA-384、SHA-512)、BC(SHA-224)
MAC
メッセージ認証コード、不可逆暗号化
JDK
メッセージ要約アルゴリズムの暗号化の最も簡単な方法はcommons-codecを使用することです.
// MD5
String md5Str = DigestUtils.md5Hex(inStr); //inStr:         , md5Str:       

// SHA1
String sha1Str = DigestUtils.sha1Hex(inStr)); //inStr:         , sha1Str: