精华内容
下载资源
问答
  • 典型的对称加密和非对称加密算法有哪些
    千次阅读
    2021-07-10 11:58:53

    1、几种对称性加密算法:AES,DES,3DES

    DES是一种分组数据加密技术(先将数据分成固定长度的小数据块,之后进行加密),速度较快,适用于大量数据加密,而3DES是一种基于DES的加密算法,使用3个不同密匙对同一个分组数据块进行3次加密,如此以使得密文强度更高。

    相较于DES和3DES算法而言,AES算法有着更高的速度和资源使用效率,安全级别也较之更高了,被称为下一代加密标准。
    2、几种非对称性加密算法:RSA,DSA,ECC

    RSA和DSA的安全性及其它各方面性能都差不多,而ECC较之则有着很多的性能优越,包括处理速度,带宽要求,存储空间等等。

    更多相关内容
  • 主要介绍了java 非对称加密算法RSA实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • RSA非对称加密算法

    2019-02-14 23:12:03
    主要介绍RSA非对称加密算法的由来和应用场景,以及加密原理
  • 主要介绍了C#实现简单的RSA非对称加密算法,结合实例形式分析了C#实现RSA加密的具体步骤与相关操作技巧,需要的朋友可以参考下
  • 对称与非对称加密算法

    千次阅读 2021-01-12 11:09:33
    二、非对称加密算法:常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。 三、散列算法(Hash算法---单向加密算法):常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA...

    一、对称加密算法 :常用的算法包括DES、3DES、AES、DESX、Blowfish、RC4、RC5、RC6。推荐用AES。

    二、非对称加密算法:常见的非对称加密算法:RSA、DSA(数字签名用)、ECC(移动设备用)、Diffie-Hellman、El Gamal。推荐用ECC(椭圆曲线密码编码学)。

    三、散列算法(Hash算法---单向加密算法):常见的Hash算法:MD2、MD4、MD5、HAVAL、SHA、SHA-1、HMAC、HMAC-MD5、HMAC-SHA1。推荐MD5、SHA-1。

    四、 加密算法的选择

    https://blog.csdn.net/liudongdong19/article/details/82217431

    展开全文
  • visual c++ vc实现RSA加密算法是最常用的非对称加密算法.zip
  • 常用的几种非对称加密算法

    万次阅读 2019-10-26 17:22:09
    相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的...


    相对对称加密而言,无需拥有同一组密钥,非对称加密是一种“信息公开的密钥交换协议”。非对称加密需要公开密钥和私有密钥两组密钥,公开密钥和私有密钥是配对起来的,也就是说使用公开密钥进行数据加密,只有对应的私有密钥才能解密。这两个密钥是数学相关,用某用户密钥加密后的密文,只能使用该用户的加密密钥才能解密。如果知道了其中一个,并不能计算出另外一个。因此如果公开了一对密钥中的一个,并不会危害到另外一个密钥性质。这里把公开的密钥为公钥,不公开的密钥为私钥。算法代表:RSA,DSA。

    RSA 能同时用于加密和数字签名,而DSA只能用于签名,本文重点讲解RSA。

    1、RSA(算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman)

    这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, AdiShamir 和Leonard Adleman。

    这种加密算法的特点主要是密钥的变化,上文我们看到DES只有一个密钥。相当于只有一把钥匙,如果这把钥匙丢了,数据也就不安全了。RSA同时有两把钥匙,公钥与私钥。同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。

    RSA 加密工具类:

    package com.blog.www.util.coder.asymmetrical;
    
    import com.blog.www.util.coder.base.BaseCoderUtils;
    import lombok.extern.slf4j.Slf4j;
    
    import javax.crypto.BadPaddingException;
    import javax.crypto.Cipher;
    import javax.crypto.IllegalBlockSizeException;
    import javax.crypto.NoSuchPaddingException;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.UnsupportedEncodingException;
    import java.nio.charset.StandardCharsets;
    import java.security.*;
    import java.security.cert.CertificateException;
    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;
    
    /**
     * RSA非对称加密解密工具类
     *
     * <p>
     * 这种算法1978年就出现了,它是第一个既能用于数据加密也能用于数字签名的算法。它易于理解和操作,也很流行。 算法的名字以发明者的名字命名:Ron
     * Rivest, AdiShamir 和Leonard Adleman。 这种加密算法的特点主要是密钥的变化,RSA同时有两把钥匙,公钥与私钥。
     * 同时支持数字签名。数字签名的意义在于,对传输过来的数据进行校验。确保数据在传输工程中不被修改。
     * <p>
     * 参考:
     * <br/>
     * <ul>
     *     <li><a href='https://www.iteye.com/blog/snowolf-381767'>Java加密技术(四)——非对称加密算法RSA</a></li>
     *     <li><a href='https://my.oschina.net/jiangli0502/blog/171263'>RSA加密解密及数字签名Java实现</a></li>
     * </ul>
     * <p>
     * <a href="https://github.com/wwwtyro/cryptico">前端demo<a> <br>
     * <br>
     */
    @Slf4j
    public class RSACoder {
    
    	/**
    	 * 填充方式。这里有【RSA/ECB/PKCS1Padding】填充(默认)和【RSA/ECB/NoPadding】填充两种可选。
    	 * <p>
    	 * 注意:使用填充时,公钥每次加密的字符串都会不一样,这样更安全;不使用则每次都一样。因为java默认是填充的,而安卓默认不填充,
    	 * 所以安卓默认加密的密文,java默认不能解密!!必须手动指定他们用一致的填充方式,才能正确加密解密。
    	 */
    	private static final String CIPHER_MODE = "RSA/ECB/PKCS1Padding";
    
    	/**
    	 * 算法类型
    	 */
    	private static final String ALGORITHM = "RSA";
    
    	/**
    	 * RSA密钥长度必须是64的倍数,在512~65536之间。默认是1024
    	 */
    	private static final int KEY_SIZE = 1024;
    
    	/**
    	 * 由公钥字节数组用Base64编码成的字符串,方便传播、储存
    	 */
    	private static final String PUB_KEY_BASE64 = "MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCxKRX+P64kA0qrd3JYYZIZ5jam63DsAlx5PKlfC0hOAhJ3wfD2Bjl3CHKNMtEKwcnZlunvikOt7/7uKdVdxDYzwpU2ivwNXDA5kMPsx8prjwS7FsdCMWnOTGWBTCYeReFHWVmSj4KxYaOO7csPWBR0AhQX9qiPSWDEKcnH5YNiiQIDAQAB";
    
    	/**
    	 * 由私钥字节数组用Base64编码成的字符串,方便传播、储存
    	 */
    	private static final String PRI_KEY_BASE64 = "MIICdwIBADANBgkqhkiG9w0BAQEFAASCAmEwggJdAgEAAoGBALEpFf4/riQDSqt3clhhkhnmNqbrcOwCXHk8qV8LSE4CEnfB8PYGOXcIco0y0QrBydmW6e+KQ63v/u4p1V3ENjPClTaK/A1cMDmQw+zHymuPBLsWx0Ixac5MZYFMJh5F4UdZWZKPgrFho47tyw9YFHQCFBf2qI9JYMQpycflg2KJAgMBAAECgYBltrwc1HzrykQFvDeXTLWwTv+TyFt19UkYhl6L5hNmTkRCI8RvzFUT5XK3ZLSmY2q7lazMTerbo44POU96XVvsV+ltmUW4ohh1cf+q7ICz73r+OEaFdxa+wHFthXvMuKpFbDiH89HfAmGGUVezf7dByClyVxn3yuKlb42ZC6AdsQJBAOyA+mBot7a98txTrMl4jRD1MI9t0dWHA51JzJ2vLBX4IlEr944Qhb6N0lNtYChEkEOCrTlLIDxWUtQhZbTP6R0CQQC/w8PcHulcbCY1JhBTefyzA4jmm9LZ0c+byqCSEiffE6/neTMLOxUpt9zDvtdWw7UvMZWgQ4a8QGZrlCw3Lw9dAkEAg9cqvE/kChU9q6FhszZmvUtR9MLttLD9TNN1I3ohg2W+C64M5L9FL4Lz+toAPrJqEZhpZIUCxWAB8ItlnTRB6QJBAKUMwsv3kxUoRG5kV5LxoK0XMsKBhaZSrmTBrxhqJgUbtb/+Eg/th1aD2LBl1oPoKE75V3Y8CICI0V5whunsSEUCQE1ZvMp5a0yblGENWU5F+kWT3aBCkmMN8Zqp2+R5p8kQ7Chxv7llCZ405YXnTdEQyLp+q6OW+eu0TdIQ3qHkA4c=";
    
    	/**
    	 * 公钥对象
    	 */
    	static PublicKey PUB_KEY;
    
    	/**
    	 * 私钥对象
    	 */
    	static PrivateKey PRI_KEY;
    
    	// 初始化
    	// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    	// 静态代码块,初始化密钥对象,供后面使用
    	static {
    		try {
    			PUB_KEY = restorePubKey();
    			PRI_KEY = restorePriKey();
    		} catch (NoSuchAlgorithmException | InvalidKeySpecException e) {
    			log.error("初始化出错", e);
    		}
    	}
    
    	/**
    	 * 从 .p12 文件中读取私钥。 <br>
    	 * <br>
    	 * 创建人: leigq <br>
    	 * 创建时间: 2017年10月28日 下午4:21:56 <br>
    	 *
    	 * @param pfxKeyFileName .p12文件路径
    	 * @param aliasName      私钥别名
    	 * @param pfxPassword    私钥密码
    	 * @return 私钥对象
    	 */
    	public static PrivateKey readP12Key(String pfxKeyFileName, String aliasName, String pfxPassword)
    			throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, UnrecoverableKeyException {
    		InputStream fis = new FileInputStream(pfxKeyFileName);
    		KeyStore keyStore = KeyStore.getInstance("PKCS12");
    		keyStore.load(fis, pfxPassword.toCharArray());
    		return (PrivateKey) keyStore.getKey(aliasName, pfxPassword.toCharArray());
    	}
    
    	// 加密、解密
    	// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
    	/**
    	 * 通用加密操作
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:37:32 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @param key  公钥或密钥对象
    	 * @param data 明文字符串
    	 * @return 密文字节数组用Base64算法编码成的字符串,方便传输、储存
    	 */
    	public static String encrypt(Key key, String data)
    			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
    			BadPaddingException {
    		Cipher cipher = Cipher.getInstance(CIPHER_MODE);
    		cipher.init(Cipher.ENCRYPT_MODE, key);
    		byte[] bytes = cipher.doFinal(data.getBytes(StandardCharsets.UTF_8));
    		return BaseCoderUtils.encryptBase64(bytes);
    	}
    
    	/**
    	 * 通用解密操作
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:43:34 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @param key  公钥或密钥对象
    	 * @param data 密文字符串(由密文字节数组用Base64算法编码成的字符串)
    	 * @return 明文字符串
    	 */
    	public static String decrypt(Key key, String data)
    			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException,
    			IllegalBlockSizeException, BadPaddingException {
    		Cipher cipher = Cipher.getInstance(CIPHER_MODE);
    		cipher.init(Cipher.DECRYPT_MODE, key);
    		byte[] bytes = cipher.doFinal(BaseCoderUtils.decryptBase64(data));
    		return new String(bytes, StandardCharsets.UTF_8);
    	}
    
    	/**
    	 * 用公钥加密 <br>
    	 * <br>
    	 * 创建人: leigq <br>
    	 * 创建时间: 2017年10月24日 下午2:00:49 <br>
    	 *
    	 * @param decoded 明文字符串
    	 * @return 密文字节数组用Base64算法编码成的字符串,方便传输、储存
    	 */
    	public static String encryptByPubKey(String decoded)
    			throws InvalidKeyException, NoSuchAlgorithmException, NoSuchPaddingException,
    			IllegalBlockSizeException, BadPaddingException {
    		return encrypt(PUB_KEY, decoded);
    	}
    
    	/**
    	 * 用私钥解密 <br>
    	 * <br>
    	 * 创建人: leigq <br>
    	 * 创建时间: 2017年10月24日 下午1:57:42 <br>
    	 *
    	 * @param encoded 密文字符串(由密文字节数组用Base64算法编码成的字符串)
    	 * @return 明文字符串
    	 */
    	public static String decryptByPriKey(String encoded) throws NoSuchPaddingException, BadPaddingException,
    			NoSuchAlgorithmException, IllegalBlockSizeException, UnsupportedEncodingException, InvalidKeyException {
    		return decrypt(PRI_KEY, encoded);
    	}
    
    	/**
    	 * 用私钥加密
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:37:32 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @param decoded 明文字符串
    	 * @return 密文字节数组用Base64算法编码成的字符串,方便传输、储存
    	 */
    	public static String encryptByPriKey(String decoded)
    			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException,
    			BadPaddingException {
    		return encrypt(PRI_KEY, decoded);
    	}
    
    	/**
    	 * 用公钥解密
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:43:34 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @param encoded 密文字符串(由密文字节数组用Base64算法编码成的字符串)
    	 * @return 明文字符串
    	 */
    	public static String decryptByPubKey(String encoded)
    			throws NoSuchAlgorithmException, NoSuchPaddingException, InvalidKeyException, UnsupportedEncodingException,
    			IllegalBlockSizeException, BadPaddingException {
    		return decrypt(PUB_KEY, encoded);
    	}
    
    
    	/**
    	 * 还原公钥,X509EncodedKeySpec 用于构建公钥的规范
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:16:50 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @return 公钥对象
    	 */
    	private static PublicKey restorePubKey()
    			throws NoSuchAlgorithmException, InvalidKeySpecException {
    		X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(BaseCoderUtils.decryptBase64(RSACoder.PUB_KEY_BASE64));
    		KeyFactory factory = KeyFactory.getInstance(ALGORITHM);
    		return factory.generatePublic(x509EncodedKeySpec);
    	}
    
    	/**
    	 * 还原私钥,PKCS8EncodedKeySpec 用于构建私钥的规范
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午5:19:09 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 *
    	 * @return 私钥对象
    	 */
    	private static PrivateKey restorePriKey()
    			throws NoSuchAlgorithmException, InvalidKeySpecException {
    		PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(BaseCoderUtils.decryptBase64(RSACoder.PRI_KEY_BASE64));
    		KeyFactory factory = KeyFactory.getInstance(ALGORITHM);
    		return factory.generatePrivate(pkcs8EncodedKeySpec);
    	}
    
    
    	// 更换密钥对
    	// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓
    
    	/**
    	 * 生成密钥对。注意这里是生成密钥对KeyPair,再由密钥对获取公私钥
    	 * <p>
    	 * 创建人:leigq <br>
    	 * 创建时间:2018年8月18日 下午7:35:21 <br>
    	 * <p>
    	 * 修改人: <br>
    	 * 修改时间: <br>
    	 * 修改备注: <br>
    	 * </p>
    	 */
    	public static void generateKeyPair() {
    		try {
    			KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(ALGORITHM);
    			keyPairGenerator.initialize(KEY_SIZE);
    			KeyPair keyPair = keyPairGenerator.generateKeyPair();
    
    			/* 公钥、私钥用 encryptBase64 还是 encryptBase64Sun 加密都可以,后者的 Base64 是多行的,比较适合保存到文件的方式储存 */
    			RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();
    			log.info("新公钥:{}", BaseCoderUtils.encryptBase64(publicKey.getEncoded()));
    
    			RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();
    			log.info("新私钥:{}", BaseCoderUtils.encryptBase64(privateKey.getEncoded()));
    
    		} catch (NoSuchAlgorithmException e) {
    			log.error("生成密钥对异常:", e);
    		}
    	}
    }
    

    测试加密:

    /**
     * RSA 测试
     */
    @Slf4j
    class RSATest {
    	public static void main(String[] args) throws IllegalBlockSizeException, NoSuchPaddingException, BadPaddingException,
    			NoSuchAlgorithmException, InvalidKeyException, UnsupportedEncodingException {
    		// 生成密钥对。注意这里是生成密钥对KeyPair,再由密钥对获取公私钥
    		RSACoder.generateKeyPair();
    
    		log.warn("公钥加密 >> 私钥解密");
    
    		String originalStr = "helloWorld";
    		log.warn("原文:{}", originalStr);
    
    		/* 公钥加密 >> 私钥解密  */
    		// 公钥加密
    		String encryptByPubKey = RSACoder.encryptByPubKey(originalStr);
    		log.warn("公钥加密后:" + encryptByPubKey);
    
    		// 私钥解密
    		String decryptByPriKey = RSACoder.decryptByPriKey(encryptByPubKey);
    		log.warn("私钥解密后:" + decryptByPriKey);
    
    
    		/* 私钥加密 >> 公钥解密 */
    		// 私钥加密
    		String encryptByPriKey = RSACoder.encryptByPriKey(originalStr);
    		log.warn("私钥加密后:" + encryptByPriKey);
    
    		// 公钥解密
    		String decryptByPubKey = RSACoder.decryptByPubKey(encryptByPriKey);
    		log.warn("公钥解密后:" + decryptByPubKey);
    	}
    }
    

    RSA加密、解密测试结果:

    20191026171006.png

    RSA 签名工具类:

    package com.blog.www.util.coder.asymmetrical;
    
    import com.blog.www.util.coder.base.BaseCoderUtils;
    import lombok.extern.slf4j.Slf4j;
    import org.apache.commons.codec.DecoderException;
    import org.apache.commons.codec.binary.Hex;
    
    import java.nio.charset.StandardCharsets;
    import java.security.InvalidKeyException;
    import java.security.NoSuchAlgorithmException;
    import java.security.Signature;
    import java.security.SignatureException;
    
    /**
     * RSA签名验签类
     */
    @Slf4j
    public class RSASignature extends RSACoder {
    
    	/**
    	 * 用哪个算法来签名
    	 */
    	private static final String SIGNATURE_ALGORITHM = "SHA1WithRSA";
    
    
    	/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 生成签名 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
    
    	/**
    	 * 用私钥生成 Base64数字签名
    	 * <br>
    	 *
    	 * @param encoded 加密字符串
    	 * @return 签名,已用Base64编码
    	 */
    	public static String signToBase64(String encoded) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    		Signature sign = getSign(encoded.getBytes(StandardCharsets.UTF_8));
    		return BaseCoderUtils.encryptBase64(sign.sign());
    	}
    
    	/**
    	 * 用私钥生成16进制数字签名
    	 * <br>
    	 *
    	 * @param encoded 加密字符串
    	 * @return 签名,已用转16进制字符串
    	 */
    	public static String signToHex(String encoded) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    		Signature sign = getSign(encoded.getBytes(StandardCharsets.UTF_8));
    		return Hex.encodeHexString(sign.sign());
    	}
    	/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 生成签名 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
    
    
    
    	/* ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ 验证签名 ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ */
    
    	/**
    	 * 用公钥校验 Base64数字签名
    	 * <br>
    	 *
    	 * @param encoded 加密数据
    	 * @param signed  签名,已用Base64编码
    	 * @return 校验成功返回true 失败返回false
    	 */
    	public static boolean verifyFromBase64(String encoded, String signed) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    		Signature verify = getVerify(encoded.getBytes(StandardCharsets.UTF_8));
    		return verify.verify(BaseCoderUtils.decryptBase64(signed));
    	}
    
    	/**
    	 * 用公钥校验 16进制数字签名
    	 * <br>
    	 *
    	 * @param data   加密数据
    	 * @param signed 签名,是由字节数组转换成的16进制字符串
    	 */
    	public static boolean verifyFromHex(String data, String signed) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException, DecoderException {
    		Signature verify = getVerify(data.getBytes(StandardCharsets.UTF_8));
    		return verify.verify(Hex.decodeHex(signed));
    	}
    	/* ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ 验证签名 ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑ */
    
    
    	/**
    	 * 用私钥生成数字签名对象
    	 * <br>
    	 *
    	 * @param encoded 加密字符串转换的字节数组
    	 * @return Signature,方便进一步转换为其他数据
    	 */
    	private static Signature getSign(byte[] encoded) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
    		signature.initSign(PRI_KEY);
    		signature.update(encoded);
    		return signature;
    	}
    
    
    	/**
    	 * 用公钥生成校验数字签名对象
    	 * <br>
    	 *
    	 * @param data 加密字符串转换的字节数组
    	 * @return
    	 */
    	private static Signature getVerify(byte[] data) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
    		Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
    		signature.initVerify(PUB_KEY);
    		signature.update(data);
    		return signature;
    	}
    }
    
    

    测试签名:

    /**
     * RSA 签名测试
     */
    @Slf4j
    class RSASignTest {
    	public static void main(String[] args) throws NoSuchAlgorithmException,
    			InvalidKeyException, SignatureException, DecoderException {
    		// 上面公钥加密产生的密文
    		String ciphertext = "S1E4OieVAlGyrOB7CzKugseg/R9TGSdDhRSna64tTpxJubpndp2AwCrJ3myIoWEqXNBPKlPVo21vd+KQgzhQcX5WxoNXD5sLarmbZ5eFsBNQOuTzwIhSql+zaUKV6qq+RTSYNR4c/fqllh5Mviq73dB42bWbUY7nHlim+jGojPY=";
    
    		log.warn("私钥签名——公钥验证签名");
    
    		// 产生签名 16 进制签名
    		String signToBase64 = RSASignature.signToBase64(ciphertext);
    		log.warn("签名:[{}]", signToBase64);
    
    		// 验证签名
    		boolean verifyFromBase64 = RSASignature.verifyFromBase64(ciphertext, signToBase64);
    		log.warn("验证签名:[{}]", verifyFromBase64);
    
    
    		// 产生签名 16 进制签名
    		String signToHex = RSASignature.signToHex(ciphertext);
    		log.warn("签名:[{}]", signToHex);
    
    		// 验证签名
    		boolean verifyFromHex = RSASignature.verifyFromHex(ciphertext, signToHex);
    		log.warn("验证签名:[{}]", verifyFromHex);
    	}
    }
    

    测试结果:

    20191026171039.png

    2、DSA 签名

    DSA-Digital Signature Algorithm 是Schnorr和ElGamal签名算法的变种,被美国NIST作为DSS(DigitalSignature Standard)。简单的说,这是一种更高级的验证方式,用作数字签名。不单单只有公钥、私钥,还有数字签名。私钥加密生成数字签名,公钥验证数据及签名。如果数据和签名不匹配则认为验证失败!数字签名的作用就是校验数据在传输过程中不被修改。数字签名,是单向加密的升级

    具体使用看:https://blog.csdn.net/jianggujin/article/details/53440060

    展开全文
  • 三种非对称加密算法总结

    万次阅读 2018-09-06 10:45:14
    最经典的非对称加密算法 也可认为是使用最多的非对称加密算法 能用于密钥分配,也能用于加解密数据(“私钥加密,公钥解密”和“公钥加密,私钥解密”) 密钥长度:512~65536(64的整数倍) 只有发送方一个...

    1、DH
    非对称算法的基石
    仅能用于密钥分配,不能用于加解密数据,一般加密数据用AES
    密钥长度:512~1024中的64的整数倍
    双方各有自己的密钥对
    2、RSA
    最经典的非对称加密算法
    也可认为是使用最多的非对称加密算法
    能用于密钥分配,也能用于加解密数据(“私钥加密,公钥解密”和“公钥加密,私钥解密”)
    密钥长度:512~65536(64的整数倍)
    只有发送方有一个密钥对,或者更安全的做法是:双发均生成自己的密钥对,但是后边使用密钥对进行加解密时与DH的区别查看前一章
    可用于数字签名
    3、ElGamal
    数字签名DSA的基础
    具体实现方式只有BC有,与RSA的实现方式类似
    只有“公钥加密,私钥加密”方式(公钥加密实际上安全性不高)
    密文会成倍扩张

    展开全文
  • 常用的三种非对称加密算法

    千次阅读 2020-08-29 11:45:37
    RSA(RSA algorithm):由RSA公司发明,是一个支持变长密钥的公开密钥算法,需要加密的文件块的长度也是可变的,非对称加密算法。 DSA(Digital Signature Algorithm):数字签名算法,是一种标准的DSS(数字签名...
  • 最近突发奇想要往数据库里保存一些机密的东西,然后就想着怎么让别人即使进入到了数据库也看不懂存储的是什么,那么只有加密了;可是我们自己还要看呢,那只能找一些对称...下面就介绍了php中简单的对称加密算法实现。
  • 1.对称加密算法加密和解密使用的密钥的是相同的,也就是只有一个密钥,而非对称加密算法有两个密钥,也就是加密和解密所使用的密钥是不同的 2.各自算法不同 3.对称加密算法加密速度快(相对的),对称算法,密钥成...
  • 对称加密:DES、3DES、DESX、Blowfish、IDEA、RC4、RC5、RC6和AES 非对称加密:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)
  • java rsa非对称加密算法3个实例源代码
  •  图1 用对称和对称相结合的加密算法变换密钥的方法举例(首先产生一个 加密的动态对称密钥,然后用非对称加密算法在两个实体问进行变换, 产生和交换密钥对的非对称加密算法是事先单独进行的未在图中示出) ...
  • 常见非对称加密算法

    万次阅读 2019-04-10 15:14:35
    对称加密技术只使用一个秘钥不同,对称机密技术使用两个秘钥进行加解密,一个叫做公钥,一个叫做私钥,私钥自己来保管,公钥可以公开,使用公钥加密的数据必须使用私钥解密,反之亦然公钥和私钥是两个不同的秘钥...
  • 主要介绍了JAVA加密算法- 非对称加密算法(DH,RSA),详细介绍了DH,RSA的用法和示例,需要的朋友可以了解一下。
  • SM2非对称国密算法

    2020-07-30 13:24:07
    本项目基于Java只对SM2非对称加密算法的公钥、私钥生成/加密/解密/签名/验签,不包含SM3、SM4算法。改方案已与硬件实战过。
  • 主要介绍了使用openssl实现rsa非对称加密算法的示例,大家参考使用吧
  • 非对称加密算法 指加密和解密使用不同密钥的加密算法,也称为公私钥加密。假设两个用户要加密交换数据,双方交换公钥,使用时一方用对方的公钥加密,另一方即可用自己的私钥解密。常见的非对称加密算法:RSA、DSA...
  • C语言实现国密SM4对称加解密算法。编译环境:VS2010。请参考我的博客https://blog.csdn.net/u013073067/article/details/86578753 分析代码
  • 主要介绍了Java 对称加密使用DES / 3DES / AES 这三种算法分别实现的相关资料,这里提供了实例代码,需要的朋友可以参考下
  • Java非对称加密算法

    2012-11-25 18:42:53
    这是本人总结的Java 非对称 加密 算法疑问可以找我1038546502@qq.com
  • 对称加密算法非对称加密算法

    千次阅读 2017-06-16 18:47:36
    (一)对称加密(Symmetric Cryptography)对称加密是最快速、最简单的一种加密方式,加密(encryption)与解密(decryption)用的是同样的密钥(secret key),这种方法在密码学中叫做对称加密算法。对称加密很多...
  • 对称加密,与对称加密的算法是有所不同的,非对称加密算法需要两个密钥,即公开密钥和私有密钥,非对称加密算法在加密和解密过程使用了不同的密钥,对称密钥也称为公钥加密,在密钥对中,其中一个密钥是对外公开...
  • 对称加密与非对称加密算法

    千次阅读 2022-01-24 16:25:55
    目录 1、对称加密 1.1、加密类型 1.1.1、流加密 ...2.1、非对称加密算法 2.1.1、RSA 2.1.2、ECC 2.1.3、SM2 3、对称加密与对称加密技术比较 4、实践 4.1、对称加密工具 4.1.1、AES加解密
  • 常见的对称加密算法与常见的非对称加密算法简单介绍: 常见的对称加密算法: 1、DES(Data Encryption Standard):数据加密标准,速度较快,适用于加密大量数据的场合;  3DES(Triple DES):是基于DES,对...
  • 加密算法
  • 一种常用的非对称加密算法. 非对称加密算法家族包含了鼻祖DH算法,基于因子分解难题的RSA算法,基于离散对数难题的ElGamal算法和ECC算法等.在本人对接过的多家银行和第三方支付接口中,RSA算法是非对称加密中的网红花旦...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 87,011
精华内容 34,804
关键字:

非对称加密算法有哪些

友情链接: nufangdexin.rar