Java 暗号化、復号化、およびデジタル署名の完全なコード例

小云云
リリース: 2017-12-06 09:14:18
オリジナル
2375 人が閲覧しました

暗号化は開発中のプログラマにとっても非常に重要です。この記事では主に Java 暗号化、復号化、デジタル署名の完全なコード例を紹介します。

一般的な暗号化アルゴリズム

基本的な一方向暗号化アルゴリズム:

BASE64 厳密に言えば、暗号化アルゴリズムではなく、エンコード形式です
MD5 (MessageDigestalgorithm5、メッセージダイジェストアルゴリズム)
SHA (SecureHashAlgorithm、安全なハッシュ)アルゴリズム) 列アルゴリズム)
HMAC (HashMessageAuthenticationCode、ハッシュされたメッセージ認証コード)

複雑な対称暗号化 (DES、PBE)、非対称暗号化アルゴリズム:

DES (DataEncryptionStandard、データ暗号化アルゴリズム)
PBE (パスワードベースの暗号化、パスワードに基づく)検証)
RSA (アルゴリズムの名前は、発明者である Ron Rivest、AdiShamir、Leonard Adleman にちなんで命名されました)
DH (Diffie-Hellman アルゴリズム、キーコンセンサスプロトコル)
DSA (DigitalSignatureAlgorithm、デジタル署名)
ECC (EllipticCurvesCryptography、楕円形)曲線暗号化) コーディング)

デジタル署名

アルゴリズムの簡単な説明

デジタル署名アルゴリズムは、キーを備えたメッセージ ダイジェスト アルゴリズムとして見ることができ、このキーには公開キーと秘密キーが含まれています。言い換えれば、デジタル署名アルゴリズムは、非対称暗号化アルゴリズムとメッセージ ダイジェスト アルゴリズムを組み合わせたものです。

機能

デジタル署名アルゴリズムには、データの整合性を検証し、データ ソースを認証し、否認防止の役割を果たす機能が必要です。

原則

デジタル署名アルゴリズムには、署名と検証の 2 つの操作が含まれており、秘密鍵署名と公開鍵検証の方法に従います。

秘密鍵と署名対象データは署名時に使用され、公開鍵、署名値、署名対象データは検証に必要です。コアアルゴリズムは主にメッセージダイジェストアルゴリズムです。

1. メッセージの概要


String beforeDegist = "asdf";  
System.out.println("摘要前:"+beforeDegist);     
//初始信息要转换成字节流的形式  
byte[] plainText = beforeDegist.getBytes("UTF8");   
//使用getInstance("算法")来获得消息摘要,这里使用SHA-1的160位算法或者MD5算法 
geDigest messageDigest = MessageDigest.getInstance("SHA-1");  
MessageDigest messageDigest = MessageDigest.getInstance("MD5");    
System.out.println("/n" + messageDigest.getProvider().getInfo());    
//开始使用算法  
messageDigest.update(plainText);    
//输出算法运算结果  
String afterDegist = new String(messageDigest.digest(),"UTF8");  
System.out.println("摘要后:"+afterDegist);
ログイン後にコピー


2. 秘密鍵の暗号化


 /** 
  * 此例子是对一个字符串信息,用一个私钥(key)加密,然后在用该私钥解密,验证是否一致 
  * 私钥加密,是对称加密 
  * 使用对称算法。比如:A用一个密钥对一个文件加密,而B读取这个文件的话,则需要和A一样的密钥,双方共享一 
  * 个私钥(而在web环境下,私钥在传递时容易被侦听) 
  *  
  * 附:主要对称算法有:DES(实际密钥只用到56 位) 
  * AES(支持三种密钥长度:128、192、256位),通常首先128位,其他的还有DESede等 
  */  
<span style="white-space: pre; ">  </span>String before = "asdf";      
    byte[] plainText = before.getBytes("UTF8");        
    // STEP 1.
ログイン後にコピー


//STEP 2.


りー

//ステップ 3.


System.out.println("Start generate AES key.");
//得到一个使用AES算法的KeyGenerator的实例  
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//定义密钥长度128位  
keyGen.init(128);
//通过KeyGenerator产生一个key(密钥算法刚才已定义,为AES)  
Key key = keyGen.generateKey();
System.out.println("Finish generating AES key="+key);
ログイン後にコピー

// ステップ 4.


    //获得一个私钥加密类Cipher,定义Cipher的基本信息:ECB是加密方式,PKCS5Padding是填充方法  
    Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");  
//System.out.println("/n" + cipher.getProvider().getInfo());
ログイン後にコピー

3. 公開鍵暗号化


// 使用私钥加密  
System.out.println("/n用私钥加密...");
// 把刚才生成的key当作参数,初始化使用刚才获得的私钥加密类,Cipher.ENCRYPT_MODE意思是加密  
cipher.init(Cipher.ENCRYPT_MODE, key);
//私钥加密类Cipher进行加密,加密后返回一个字节流byte[]  
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String  
String after1 = new String(cipherText, "UTF8");
System.out.println("用私钥加密完成:"+after1);
ログイン後にコピー

4. デジタル署名


[java] view plain copy
//使用私钥对刚才加密的信息进行解密,看看是否一致,Cipher.DECRYPT_MODE意思是解密钥  
System.out.println("/n用私钥解密...");
cipher.init(Cipher.DECRYPT_MODE, key);
//对刚才私钥加密的字节流进行解密,解密后返回一个字节流byte[]  
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私钥解密完成:"+after2);
ログイン後にコピー

5. デジタル証明書


String before = "asdf";
byte[] plainText = before.getBytes("UTF8");
//产生一个RSA密钥生成器KeyPairGenerator(顾名思义:一对钥匙生成器)  
KeyPairGenerator keyGen = KeyPairGenerator.getInstance("RSA");
//定义密钥长度1024位  
keyGen.initialize(1024);
//通过KeyPairGenerator产生密钥,注意:这里的key是一对钥匙!!  
KeyPair key = keyGen.generateKeyPair();
//获得一个RSA的Cipher类,使用公钥加密  
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//System.out.println("/n" + cipher.getProvider().getInfo());  
System.out.println("/n用公钥加密...");
//Cipher.ENCRYPT_MODE意思是加密,从一对钥匙中得到公钥 key.getPublic()  
cipher.init(Cipher.ENCRYPT_MODE, key.getPublic());
//用公钥进行加密,返回一个字节流  
byte[] cipherText = cipher.doFinal(plainText);
//以UTF8格式把字节流转化为String  
String after1 = new String(cipherText, "UTF8");
System.out.println("用公钥加密完成:"+after1);
//使用私钥解密  
System.out.println("/n用私钥解密...");
//Cipher.DECRYPT_MODE意思是解密模式,从一对钥匙中得到私钥 key.getPrivate()  
cipher.init(Cipher.DECRYPT_MODE, key.getPrivate());
//用私钥进行解密,返回一个字节流  
byte[] newPlainText = cipher.doFinal(cipherText);
String after2 = new String(newPlainText, "UTF8");
System.out.println("用私钥解密完成:"+after2);
ログイン後にコピー


上記の内容はすべて、Java 暗号化、復号化、およびデジタル署名の完全なコード例に関するものです。良いと思われる場合は、急いで収集してください。


関連する推奨事項:

暗号化と復号化に関する mysql 関数

Java での DES 暗号化および復号化ツール クラスの実装例

PHP 暗号化と復号化のいくつかの方法に関する使用チュートリアル

以上がJava 暗号化、復号化、およびデジタル署名の完全なコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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