`
lobin
  • 浏览: 427400 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

非对称加密算法

 
阅读更多

非对称加密算法: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: 

 

 

0
0
分享到:
评论

相关推荐

    RSA非对称加密算法

    RSA 非对称加密算法 RSA 非对称加密算法是一种经典的非对称加密算法,由罗纳德·李维斯特、阿迪·萨莫尔和伦纳德·阿德曼三人于 1977 年共同提出的。该算法的主要思想是基于大素数的乘积和因式分解之间的关系,通过...

    密码学实验_对称加密算法DES_非对称加密算法RSA.pdf

    本实验报告主要涉及两种加密算法:对称加密算法DES(Data Encryption Standard)和非对称加密算法RSA。实验旨在帮助学生深入理解这两种算法的基本原理,并通过Python编程实现加密和解密过程。 ### **对称加密算法...

    非对称加密算法 数字签名算法

    非对称加密算法和数字签名是信息技术中两个关键的安全概念,尤其在网络安全和数据保护方面起着至关重要的作用。在Java编程环境中,这些技术被广泛应用于实现安全通信、身份验证和数据完整性保护。 非对称加密算法,...

    非对称加密算法流程图

    非对称加密算法流程图,使用visio绘制。

    ECC非对称加密算法

    ECC非对称加密算法, 最快,最安全的加密算法

    java加密算法:Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法

    java关于加密的算法demo代码(Base64加密\数字签名\对称加密算法\非对称加密算法\消息摘要算法) JAVA安全实现三种方式: 1.JDK 2.Commons Codec 3.Bouncy Castle 一。非对称加密算法: 1.DH 2.RSA 3.ELGamal 二。...

    用.NET非对称加密算法实例

    ### 使用.NET非对称加密算法实例 #### 一、引言 非对称加密是一种重要的加密方式,在现代信息安全领域有着广泛的应用。与对称加密不同的是,非对称加密使用一对密钥:公钥和私钥。公钥可以公开分发,而私钥则必须...

    Java非对称加密算法

    这是本人总结的Java 非对称 加密 算法,有疑问可以找我1038546502@qq.com

    R S A 非对称加密算法

    RSA非对称加密算法是密码学中的一个重要概念,由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是一种基于大素数分解困难性的公钥加密算法,对于网络安全、数据保护以及数字签名等领域具有...

    对称加密算法与非对称加密算法.doc

    ### 对称加密算法与非对称加密算法 #### 对称加密算法 ##### 概述 对称加密算法是一种历史悠久且广泛使用的加密技术。在这种加密方式中,加密和解密使用相同的密钥。也就是说,发送方使用一个密钥来加密信息,接收...

    Rsa.rar_RSA 算法_java 非对称 加密 算法_rsa java

    RSA算法是一种非对称加密算法,它在信息安全领域有着广泛的应用,特别是在数据传输中的安全保护。这个RAR压缩包包含了一个名为“Rsa.java”的源代码文件,可能是用于演示如何在Java环境中实现RSA算法。另一个文件...

    nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。

    内容概要:nacos1.1.4版本修改源码使用非对称加密算法RSA进行用户名和密码加密传输。 适用人群:需要适用nacos作为项目注册中心的相关人员、内网用户。 适用场景:linux或者windows系统,使用nacos作为注册中心,...

    常见加密算法方式(对称加密和非对称加密)

    在实际操作中,经常采用混合加密模式:利用非对称加密算法交换对称加密算法的密钥,再利用对称加密算法加密实际数据,从而结合两种加密算法的优点。 总之,加密算法是信息安全领域的基石,合理选择和使用加密算法...

    Java非对称加密算法演示源码.rar

    一个来自Java非对称加密算法演示源码,通过网络或磁盘等方式,把公钥编码传送给李四,李四接收到张三编码后的公钥,将其解码,将公钥的KeySpec对象转换为公钥,张三用自己的私钥解密从李四处收到的信息,里面对原理的...

    椭圆曲线非对称加密算法

    **椭圆曲线非对称加密算法详解** 椭圆曲线非对称加密算法(Elliptic Curve Cryptography,简称ECC)是一种基于数学难题——椭圆曲线离散对数问题的现代密码学技术。与传统的RSA等非对称加密算法相比,ECC在安全性...

    RSA非对称加密算法的实现.zip

    RSA非对称加密算法是密码学中的一个重要概念,它的出现极大地推动了网络安全的发展。这个算法由Ron Rivest、Adi Shamir和Leonard Adleman在1977年提出,因此得名RSA。它是基于大数因子分解的困难性,为数据交换和...

Global site tag (gtag.js) - Google Analytics