常见哈希算法;加密算法,对称式加密与非对称式加密的对比( 三 )


在CBC模式下,需要随机生成一个16字节的IV参数,必须使用生成 。因为多了一个实例,因此初始化需要调用的重载方法并且传入/
非对称加密:加密和解密使用的不是相同的密钥,只有同一个公钥-私钥对才能正常加解密 。
例如:小明要加密一个文件发送给小红,他应该首先向小红索取她的公钥,然后,他用小红的公钥加密,把加密文件发送给小红,此文件只能由小红的私钥解开,因为小红的私钥在她自己手里,所以,除了小红,没有任何人能解开此文件 。
非对称加密的典型算法就是RSA算法
非对称加密的缺点:运算速度非常慢,比对称加密要慢很多
在实际应用的时候,非对称加密总是和对称加密一起使用,假设小明需要给小红需要传输加密文件,他俩首先交换了各自的公钥,然后:
1.小明生成一个随机的AES口令,然后用小红的公钥通过RSA加密这个口令,并发给小红;
2.小红用自己的 RSA 私钥解密得到AES 口令;
3.双方使用这个共享的AES 口令用 AES 加密通信 。
【常见哈希算法;加密算法,对称式加密与非对称式加密的对比】import java.math.BigInteger;import java.security.GeneralSecurityException;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import javax.crypto.Cipher;// RSApublic class Main {public static void main(String[] args) throws Exception {// 明文:byte[] plain = "Hello, encrypt use RSA".getBytes("UTF-8");// 创建公钥/私钥对:Human alice = new Human("Alice");// 用Alice的公钥加密:// 获取Alice的公钥,并输出byte[] pk = alice.getPublicKey();System.out.println(String.format("public key(公钥): %x", new BigInteger(1, pk)));// 使用公钥加密byte[] encrypted = alice.encrypt(plain);System.out.println(String.format("encrypted(加密): %x", new BigInteger(1, encrypted)));// 用Alice的私钥解密:// 获取Alice的私钥,并输出byte[] sk = alice.getPrivateKey();System.out.println(String.format("private key(私钥): %x", new BigInteger(1, sk)));// 使用私钥解密byte[] decrypted = alice.decrypt(encrypted);System.out.println("decrypted(解密): " + new String(decrypted, "UTF-8"));}}// 用户类class Human {// 姓名String name;// 私钥:PrivateKey sk;// 公钥:PublicKey pk;// 构造方法public Human(String name) throws GeneralSecurityException {// 初始化姓名this.name = name;// 生成公钥/私钥对:KeyPairGenerator kpGen = KeyPairGenerator.getInstance("RSA");kpGen.initialize(1024);KeyPair kp = kpGen.generateKeyPair();this.sk = kp.getPrivate();this.pk = kp.getPublic();}// 把私钥导出为字节public byte[] getPrivateKey() {return this.sk.getEncoded();}// 把公钥导出为字节public byte[] getPublicKey() {return this.pk.getEncoded();}// 用公钥加密:public byte[] encrypt(byte[] message) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.ENCRYPT_MODE, this.pk); // 使用公钥进行初始化return cipher.doFinal(message);}// 用私钥解密:public byte[] decrypt(byte[] input) throws GeneralSecurityException {Cipher cipher = Cipher.getInstance("RSA");cipher.init(Cipher.DECRYPT_MODE, this.sk); // 使用私钥进行初始化return cipher.doFinal(input);}}