非对称加密算法:ECIESwithAES
参考椭圆曲线加密:elliptic curve cryptography (ECC), 这里的椭圆曲线:elliptic curve(EC)。
使用公钥加密,再使用私钥解密。不像RSA,既可以使用公钥加密,再使用私钥解密,也可以私钥加密,再使用公钥解密
private static Provider provider = null; private static BCECPrivateKey privateKey = null; private static byte[] privateKeyEncoded1 = null; private static BCECPublicKey publicKey = null; private static byte[] publicKeyEncoded1 = null;
@BeforeClass public static void init() /* throws NoSuchAlgorithmException */ { init0(); }
public static void init0() /* throws NoSuchAlgorithmException */ { provider = new BouncyCastleProvider(); // provider = new BouncyCastlePQCProvider(); KeyPairGenerator keyPairGenerator = null; try { keyPairGenerator = KeyPairGenerator.getInstance("EC", provider); // sun.security.rsa.RSAKeyPairGenerator } catch (NoSuchAlgorithmException e) { Assert.fail("no such algorithm: " + e.getMessage()); } keyPairGenerator.initialize(256, new SecureRandom()); KeyPair keyPair1 = keyPairGenerator.generateKeyPair(); privateKey = (BCECPrivateKey) keyPair1.getPrivate(); publicKey = (BCECPublicKey) keyPair1.getPublic(); privateKeyEncoded1 = privateKey.getEncoded(); publicKeyEncoded1 = publicKey.getEncoded(); System.out.println("private key: " + Base64.byteArrayToBase64(privateKeyEncoded1)); System.out.println("public key: " + Base64.byteArrayToBase64(publicKeyEncoded1)); }
/** * 使用公钥加密,再使用私钥解密 */ @Test public void test1() { String message = "13120983870"; System.out.println(message); IESCipher.ECIESwithAES cipher1 = new IESCipher.ECIESwithAES(); try { cipher1.engineInit(Cipher.ENCRYPT_MODE, publicKey, new SecureRandom()); } catch (InvalidKeyException e) { Assert.fail("invalid key: " + e.getMessage()); } byte[] encryption1 = null; try { encryption1 = cipher1.engineDoFinal(message.getBytes(), 0, message.getBytes().length); } catch (IllegalBlockSizeException e) { Assert.fail("illegal block size: " + e.getMessage()); } catch (BadPaddingException e) { Assert.fail("bad padding: " + e.getMessage()); } System.out.println("encryption: " + Base64.byteArrayToBase64(encryption1)); cipher1 = new IESCipher.ECIESwithAES(); try { cipher1.engineInit(Cipher.DECRYPT_MODE, privateKey, new SecureRandom()); } catch (InvalidKeyException e) { Assert.fail("invalid key: " + e.getMessage()); } byte[] decryption1 = null; try { decryption1 = cipher1.engineDoFinal(encryption1, 0, encryption1.length); } catch (IllegalBlockSizeException e) { Assert.fail("illegal block size: " + e.getMessage()); } catch (BadPaddingException e) { Assert.fail("bad padding: " + e.getMessage()); } System.out.println("decryption: " + new String(decryption1) + ", base64:" + Base64.byteArrayToBase64(decryption1)); }
private key: MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQgQ4vAWWNYMncNYX/kkgxPhUullJk4UR5hTEW1krcqD32gCgYIKoZIzj0DAQehRANCAATs04Bcawzubw4ozfPRhkZpykWw6TErFPhIwOYihY/RrbaiaIGJJdvbIpxm3D+YqFcnSSbTH5WXrxpQToXiUPtc public key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAE7NOAXGsM7m8OKM3z0YZGacpFsOkxKxT4SMDmIoWP0a22omiBiSXb2yKcZtw/mKhXJ0km0x+Vl68aUE6F4lD7XA== 13120983870 encryption: BK8kO9AQoMYqTK8/BedPndCfVPpxhuvfSxUHM0UDNeWNV6RsaDOI0/XTC/5BGIkbt40JN7/T8wY9NfDZYx/jye5w09aqt90TIzBpBL7MC1jgBieji433pu2ZzhSizVwJ9QCt0zc= decryption: 13120983870, base64:MTMxMjA5ODM4NzA=
private void encryptAndDecrypt(String message, PrivateKey privateKey, PublicKey publicKey) { IESCipher.ECIESwithAES cipher1 = new IESCipher.ECIESwithAES(); try { cipher1.engineInit(Cipher.ENCRYPT_MODE, publicKey, new SecureRandom()); } catch (InvalidKeyException e) { Assert.fail("invalid key: " + e.getMessage()); } byte[] encryption1 = null; try { encryption1 = cipher1.engineDoFinal(message.getBytes(), 0, message.getBytes().length); } catch (IllegalBlockSizeException e) { Assert.fail("illegal block size: " + e.getMessage()); } catch (BadPaddingException e) { Assert.fail("bad padding: " + e.getMessage()); } System.out.println("encryption: " + Base64.byteArrayToBase64(encryption1)); cipher1 = new IESCipher.ECIESwithAES(); try { cipher1.engineInit(Cipher.DECRYPT_MODE, privateKey, new SecureRandom()); } catch (InvalidKeyException e) { Assert.fail("invalid key: " + e.getMessage()); } byte[] decryption1 = null; try { decryption1 = cipher1.engineDoFinal(encryption1, 0, encryption1.length); } catch (IllegalBlockSizeException e) { Assert.fail("illegal block size: " + e.getMessage()); } catch (BadPaddingException e) { Assert.fail("bad padding: " + e.getMessage()); } System.out.println("decryption: " + new String(decryption1) + ", base64:" + Base64.byteArrayToBase64(decryption1)); }
@Test public void test_1() { String privKey = "MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg9ye6MPlsZbIKD3hwqWebMOkmcKHlk0NEmTbPKQDZxe2gCgYIKoZIzj0DAQehRANCAARZXl/Wn+3uVSyk/VDncYFNazAjPMEBXEwS/iWy0hwidaU3t3OrYXVMsE5xqx7qtgmBu0/dbCdyUmwMVL5CclFq"; String pubKey = "MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWV5f1p/t7lUspP1Q53GBTWswIzzBAVxMEv4lstIcInWlN7dzq2F1TLBOcase6rYJgbtP3WwnclJsDFS+QnJRag=="; byte[] privateKeyEncoded = Base64.base64ToByteArray(privKey); byte[] publicKeyEncoded = Base64.base64ToByteArray(pubKey); String message = "13120983870"; System.out.println(message); PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyEncoded); ECKeyFactorySpi keyFactory = new ECKeyFactorySpi(); PrivateKey privateKey = null; try { privateKey = keyFactory.engineGeneratePrivate(pkcs8KeySpec); } catch (InvalidKeySpecException e) { Assert.fail("invalid key spec: " + e.getMessage()); } System.out.println("private key: " + Base64.byteArrayToBase64(((Key) privateKey).getEncoded())); X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(publicKeyEncoded); keyFactory = new ECKeyFactorySpi(); PublicKey publicKey = null; try { publicKey = keyFactory.engineGeneratePublic(x509KeySpec); } catch (InvalidKeySpecException e) { Assert.fail("invalid key spec: " + e.getMessage()); } System.out.println("public key: " + Base64.byteArrayToBase64(((Key) publicKey).getEncoded())); encryptAndDecrypt(message, privateKey, publicKey); }
13120983870 private key: MIGTAgEAMBMGByqGSM49AgEGCCqGSM49AwEHBHkwdwIBAQQg9ye6MPlsZbIKD3hwqWebMOkmcKHlk0NEmTbPKQDZxe2gCgYIKoZIzj0DAQehRANCAARZXl/Wn+3uVSyk/VDncYFNazAjPMEBXEwS/iWy0hwidaU3t3OrYXVMsE5xqx7qtgmBu0/dbCdyUmwMVL5CclFq public key: MFkwEwYHKoZIzj0CAQYIKoZIzj0DAQcDQgAEWV5f1p/t7lUspP1Q53GBTWswIzzBAVxMEv4lstIcInWlN7dzq2F1TLBOcase6rYJgbtP3WwnclJsDFS+QnJRag== encryption: BLcrguLmGY9Hetf7UmtAyTg+8fVmH2Ya/oBjRHzwkbTZpiKbOBR+a44y2PJROBZDFBDZJTExb17HqRe1XFxeDSA5mmb2t1xhwxwd4PgckThbGhLewx151Mww2eyA9gWDMC9Wqrs= decryption: 13120983870, base64:MTMxMjA5ODM4NzA=
package org.spongycastle.jcajce.provider.asymmetric.ec; import java.security.PrivateKey; import java.security.PublicKey; import java.security.spec.InvalidKeySpecException; import java.security.spec.KeySpec; import org.spongycastle.jce.provider.BouncyCastleProvider; public class ECKeyFactorySpi extends org.spongycastle.jcajce.provider.asymmetric.ec.KeyFactorySpi { public ECKeyFactorySpi() { super("EC", BouncyCastleProvider.CONFIGURATION); } public PrivateKey engineGeneratePrivate( KeySpec keySpec) throws InvalidKeySpecException { return super.engineGeneratePrivate(keySpec); } public PublicKey engineGeneratePublic( KeySpec keySpec) throws InvalidKeySpecException { return super.engineGeneratePublic(keySpec); } }
非对称加密算法-Diffie-Hellman
非对称加密算法Diffie-Hellman,这种加密算法已经过时了。有时间整理下相关资料。
整理后再贴出来。。。 :lol:
相关推荐
RSA 非对称加密算法 RSA 非对称加密算法是一种经典的非对称加密算法,由罗纳德·李维斯特、阿迪·萨莫尔和伦纳德·阿德曼三人于 1977 年共同提出的。该算法的主要思想是基于大素数的乘积和因式分解之间的关系,通过...
本实验报告主要涉及两种加密算法:对称加密算法DES(Data Encryption Standard)和非对称加密算法RSA。实验旨在帮助学生深入理解这两种算法的基本原理,并通过Python编程实现加密和解密过程。 ### **对称加密算法...
非对称加密算法和数字签名是信息技术中两个关键的安全概念,尤其在网络安全和数据保护方面起着至关重要的作用。在Java编程环境中,这些技术被广泛应用于实现安全通信、身份验证和数据完整性保护。 非对称加密算法,...
非对称加密算法流程图,使用visio绘制。
ECC非对称加密算法, 最快,最安全的加密算法
java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...
### 使用.NET非对称加密算法实例 #### 一、引言 非对称加密是一种重要的加密方式,在现代信息安全领域有着广泛的应用。与对称加密不同的是,非对称加密使用一对密钥:公钥和私钥。公钥可以公开分发,而私钥则必须...
这是本人总结的Java 非对称 加密 算法,有疑问可以找我1038546502@qq.com
RSA非对称加密算法是密码学中的一个重要概念,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是一种基于大素数分解困难性的公钥加密算法,对于网络安全、数据保护以及数字签名等领域具有...
### 对称加密算法与非对称加密算法 #### 对称加密算法 ##### 概述 对称加密算法是一种历史悠久且广泛使用的加密技术。在这种加密方式中,加密和解密使用相同的密钥。也就是说,发送方使用一个密钥来加密信息,接收...
RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输中的安全保护。这个RAR压缩包包含了一个名为“Rsa.java”的源代码文件,可能是用于演示如何在Java环境中实现RSA算法。另一个文件...
内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...
在实际操作中,经常采用混合加密模式:利用非对称加密算法交换对称加密算法的密钥,再利用对称加密算法加密实际数据,从而结合两种加密算法的优点。 总之,加密算法是信息安全领域的基石,合理选择和使用加密算法...
一个来自Java非对称加密算法演示源码,通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,将公钥的KeySpec对象转换为公钥,张三用自己的私钥解密从李四处收到的信息,里面对原理的...
**椭圆曲线非对称加密算法详解** 椭圆曲线非对称加密算法(Elliptic Curve Cryptography,简称ECC)是一种基于数学难题——椭圆曲线离散对数问题的现代密码学技术。与传统的RSA等非对称加密算法相比,ECC在安全性...
RSA非对称加密算法是密码学中的一个重要概念,它的出现极大地推动了网络安全的发展。这个算法由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是基于大数因子分解的困难性,为数据交换和...