对称加密和非对称加密区别 您所在的位置:网站首页 公钥获取私钥 对称加密和非对称加密区别

对称加密和非对称加密区别

2023-04-14 15:02| 来源: 网络整理| 查看: 265

1 对称加密

对称加密就是使用同一把密钥加密、解密。对称加密由于加和解密使用的是同一个密钥算法,故而在加解密的过程中速度比较快。

常用的对称加密算法有 AES、DES、3DES、TDEA、Blowfish、RC2、RC4 和 RC5 等。

1.1 优点

对称加密的主要有优点就是算法公开、计算量小、加密速度快、加密效率高。

1.2 缺点

密钥协商过程中,一旦密钥泄露,别人获取到密钥,也能对密文进行解密;

每对用户每次使用对称加密算法时,都需要使用其他人不知道的独一密钥,这会使得收、发双方所拥有的钥匙数量巨大,密钥管理成为双方的负担。

2 非对称加密

非对称加密会产生两把密钥,分别为公钥(Public Key)和私钥(Private Key),其中一把密钥用于加密,另一把密钥用于解密。非对称加密的特征是算法强度复杂、安全性依赖于算法与密钥但是由于其算法复杂,而使得加密解密速度没有对称加密解密的速度快。

对称密码体制中只有一种密钥,并且是非公开的,如果要解密就得让对方知道密钥。所以保证其安全性就是保证密钥的安全,而非对称密钥体制有两种密钥,其中一个是公开的,这样就可以不需要像对称密码那样传输对方的密钥了。这样安全性就高了很多。

A 要向 B 发送信息,A 和 B 都要产生一对用于加密和解密的公钥和私钥。 A 的私钥保密,A 的公钥告诉 B;B 的私钥保密,B 的公钥告诉 A。 A 要给 B 发送信息时,A 用 B 的公钥加密信息,因为 A 知道 B 的公钥。 A 将这个消息发给 B (已经用 B 的公钥加密消息)。 B 收到这个消息后,B 用自己的私钥解密 A 的消息。其他所有收到这个报文的人都无法解密,因为只有 B 才有 B 的私钥。2.1 优点

私钥保密,公钥分发,公钥被截取也无法破解密文。

2.2 缺点

运行速度慢。

常用的非对称加密算发有 RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)等。

2.3 RSA示例代码import javax.crypto.Cipher; import java.io.ByteArrayOutputStream; import java.security.*; import java.security.interfaces.RSAPrivateKey; import java.security.interfaces.RSAPublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Base64; import java.util.HashMap; import java.util.Map; public class RSAUtil { public static final String KEY_ALGORITHM = "RSA"; private static final String PUBLIC_KEY = "RSAPublicKey"; private static final String PRIVATE_KEY = "RSAPrivateKey"; // 1024 bits 的 RSA 密钥对,最大加密明文大小 private static final int MAX_ENCRYPT_BLOCK = 117; // 1024 bits 的 RSA 密钥对,最大解密密文大小 private static final int MAX_DECRYPT_BLOCK = 128; // 生成密钥对 public static Map initKey(int keysize) throws Exception { KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM); // 设置密钥对的 bit 数,越大越安全 keyPairGen.initialize(keysize); KeyPair keyPair = keyPairGen.generateKeyPair(); // 获取公钥 RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic(); // 获取私钥 RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate(); Map keyMap = new HashMap(2); keyMap.put(PUBLIC_KEY, publicKey); keyMap.put(PRIVATE_KEY, privateKey); return keyMap; } // 获取公钥字符串 public static String getPublicKeyStr(Map keyMap) { // 获得 map 中的公钥对象,转为 key 对象 Key key = (Key) keyMap.get(PUBLIC_KEY); // 编码返回字符串 return encryptBASE64(key.getEncoded()); } // 获取私钥字符串 public static String getPrivateKeyStr(Map keyMap) { // 获得 map 中的私钥对象,转为 key 对象 Key key = (Key) keyMap.get(PRIVATE_KEY); // 编码返回字符串 return encryptBASE64(key.getEncoded()); } // 获取公钥 public static PublicKey getPublicKey(String publicKeyString) throws NoSuchAlgorithmException, InvalidKeySpecException { byte[] publicKeyByte = Base64.getDecoder().decode(publicKeyString); X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKeyByte); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePublic(keySpec); } // 获取私钥 public static PrivateKey getPrivateKey(String privateKeyString) throws Exception { byte[] privateKeyByte = Base64.getDecoder().decode(privateKeyString); PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKeyByte); KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); return keyFactory.generatePrivate(keySpec); } /** * BASE64 编码返回加密字符串 * * @param key 需要编码的字节数组 * @return 编码后的字符串 */ public static String encryptBASE64(byte[] key) { return new String(Base64.getEncoder().encode(key)); } /** * BASE64 解码,返回字节数组 * * @param key 待解码的字符串 * @return 解码后的字节数组 */ public static byte[] decryptBASE64(String key) { return Base64.getDecoder().decode(key); } /** * 公钥加密 * * @param text 待加密的明文字符串 * @param publicKeyStr 公钥 * @return 加密后的密文 */ public static String encrypt1(String text, String publicKeyStr) { try { System.out.println("明文字符串为:[{}]"+ text); Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.ENCRYPT_MODE, getPublicKey(publicKeyStr)); byte[] tempBytes = cipher.doFinal(text.getBytes("UTF-8")); return Base64.getEncoder().encodeToString(tempBytes); } catch (Exception e) { throw new RuntimeException("加密字符串[" + text + "]时遇到异常", e); } } /** * 私钥解密 * * @param secretText 待解密的密文字符串 * @param privateKeyStr 私钥 * @return 解密后的明文 */ public static String decrypt1(String secretText, String privateKeyStr) { try { // 生成私钥 Cipher cipher = Cipher.getInstance(KEY_ALGORITHM); cipher.init(Cipher.DECRYPT_MODE, getPrivateKey(privateKeyStr)); // 密文解码 byte[] secretTextDecoded = Base64.getDecoder().decode(secretText.getBytes("UTF-8")); byte[] tempBytes = cipher.doFinal(secretTextDecoded); return new String(tempBytes); } catch (Exception e) { throw new RuntimeException("解密字符串[" + secretText + "]时遇到异常", e); } } public static void main(String[] args) throws Exception { Map keyMap; String cipherText; // 原始明文 String content = "春江潮水连海平,海上明月共潮生。滟滟随波千万里,何处春江无月明。"; // 生成密钥对 keyMap = initKey(1024); String publicKey = getPublicKeyStr(keyMap); System.out.println("公钥:[{}],长度:[{}]"+ publicKey +" "+publicKey.length()); String privateKey = getPrivateKeyStr(keyMap); System.out.println("私钥:[{}],长度:[{}]"+ privateKey +" "+ privateKey.length()); // 加密 cipherText = encrypt1(content, publicKey); System.out.println("加密后的密文:[{}],长度:[{}]"+ cipherText +" "+ cipherText.length()); // 解密 String plainText = decrypt1(cipherText, privateKey); System.out.println("解密后明文:[{}]"+ plainText); } }



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有