暗号化は開発中のプログラマにとっても非常に重要です。この記事では主に 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);
関連する推奨事項:
暗号化と復号化に関する mysql 関数
Java での DES 暗号化および復号化ツール クラスの実装例PHP 暗号化と復号化のいくつかの方法に関する使用チュートリアル
以上がJava 暗号化、復号化、およびデジタル署名の完全なコード例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。