赞
踩
公开密钥密码学(英语:Public-key cryptography)也称非对称式密码学(英语:Asymmetric cryptography)是密码学的一种算法,它需要两个密钥,一个是公开密钥,另一个是私有密钥;公钥用作加密,私钥则用作解密。使用公钥把明文加密后所得的密文,只能用相对应的私钥才能解密并得到原本的明文,最初用来加密的公钥不能用作解密。由于加密和解密需要两个不同的密钥,故被称为非对称加密;不同于加密和解密都使用同一个密钥的对称加密。公钥可以公开,可任意向外发布;私钥不可以公开,必须由用户自行严格秘密保管,绝不透过任何途径向任何人提供,也不会透露给被信任的要通信的另一方。
基于公开密钥加密的特性,它还能提供数字签名的功能,使电子文件可以得到如同在纸本文件上亲笔签署的效果。公开密钥基础建设透过信任数字证书认证机构的根证书、及其使用公开密钥加密作数字签名核发的公开密钥认证,形成信任链架构,已在TLS实现并在万维网的HTTP以HTTPS、在电子邮件的SMTP以SMTPS或STARTTLS引入。
在现实世界上可作比拟的例子是,一个传统保管箱,开门和关门都是使用同一条钥匙,这是对称加密;而一个公开的邮箱,投递口是任何人都可以寄信进去的,这可视为公钥;而只有信箱主人拥有钥匙可以打开信箱,这就视为私钥。
非对称加密过程:
此流程图显示非对称加密过程是单向的,其中一条密钥加密后只能用相对应的另一条密钥解密。
密钥长度 | 默认 | 工作模式 | 填充方式 | 实现方 |
512~1024(64倍数) | 1024 | 无 | 无 | JDK |
DH加解密应用:
- package com.bity.dh;
-
- import org.apache.commons.codec.binary.Base64;
-
- import javax.crypto.BadPaddingException;
- import javax.crypto.Cipher;
- import javax.crypto.IllegalBlockSizeException;
- import javax.crypto.KeyAgreement;
- import javax.crypto.NoSuchPaddingException;
- import javax.crypto.SecretKey;
- import javax.crypto.interfaces.DHPublicKey;
- import javax.crypto.spec.DHParameterSpec;
- import java.nio.charset.StandardCharsets;
- import java.security.InvalidAlgorithmParameterException;
- import java.security.InvalidKeyException;
- import java.security.KeyFactory;
- import java.security.KeyPair;
- import java.security.KeyPairGenerator;
- import java.security.NoSuchAlgorithmException;
- import java.security.PrivateKey;
- import java.security.PublicKey;
- import java.security.spec.InvalidKeySpecException;
- import java.security.spec.X509EncodedKeySpec;
- import java.util.Objects;
-
- import static java.lang.System.*;
-
- /**
- * <p>Title: JdkDh</p >
- * <p>Description: DH非对称算法实现 </p >
- * <p>Company: http://www.agree.com</p >
- * <p>Project: security</p >
- *
- * @author <a href="mailto:weiqi@agree.com.cn">WEIQI</a>
- * @version 1.0
- * @date 2022-04-27 19:51
- */
- public class JdkDh {
-
- private static final String SRC = "I'm DH encryption algorithm";
-
- public static void main(String[] args) {
- // 解决 Unsupported secret key algorithm: DES 异常
- System.getProperties().setProperty("jdk.crypto.KeyAgreement.legacyKDF", "true");
- jdkDh();
- }
-
- private static void jdkDh() {
- try {
- // 初始化发送方密钥
- KeyPairGenerator senderKeyPairGenerator = KeyPairGenerator.getInstance("DH");
- senderKeyPairGenerator.initialize(512);
- KeyPair senderKeyPair = senderKeyPairGenerator.generateKeyPair();
- // 发送方密钥,发送给接收方(可以通过文件、优盘、网络等...)
- byte[] senderPublicKeyEnc = senderKeyPair.getPublic().getEncoded();
-
- // 初始化接收方密钥,注意在实际环境中接收方和发送方肯定不会在一个函数中
- KeyFactory keyFactory = KeyFactory.getInstance("DH");
- X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(senderPublicKeyEnc);
- PublicKey receiverPublicKey &#
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。