大家好,欢迎来到IT知识分享网。
1、ECC算法介绍
ECC,是英语Elliptic Curve Cryptography的缩写,即“椭圆曲线密码学”,ECC基于椭圆曲线数学而建立。
ECC是一种不对称加密算法,相对于RSA算法,ECC算法所需要的密钥更短,加密强度更高。有一种说法,160位密钥的ECC算法,相当于1024位密钥的RSA算法。
ECC算法于1985年提出后,受到了密码界人士的青睐。有支持ECC的商业公司愿意出巨资,奖励ECC算法的成功激活成功教程者。
2003年,一个研究团队,使用上万台PC机,花了1.5年时间,才能激活成功教程109位的ECC算法,从这个情况来看,激活成功教程160位以上的ECC算法,所需要的海量计算能力,让激活成功教程变得几乎不可能。
2、ECC算法在Java语言的实现
JDK目前尚未支持ECC算法,为了使用ECC算法,我们需要使用第三方库。
本讲使用了Bouncy Castle提供的ECC算法支持,为了在项目中使用Bouncy Castle,我们需要在pom.xml文件中加入依赖,例如:
<dependency> <groupId>org.bouncycastle</groupId> <artifactId>bcprov-jdk15on</artifactId> <version>1.66</version> </dependency>
3、示例程序
下面是一个使用ECC算法的示例程序,完整源代码如下:
package com.flying.ecc; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import javax.crypto.BadPaddingException; import javax.crypto.Cipher; import javax.crypto.IllegalBlockSizeException; import javax.crypto.NoSuchPaddingException; import java.security.*; import java.security.interfaces.ECPrivateKey; import java.security.interfaces.ECPublicKey; @SpringBootApplication public class EccApplication { public static void main(String[] args) throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, InvalidKeyException, IllegalBlockSizeException, BadPaddingException { SpringApplication.run(EccApplication.class, args); //添加Bouncy Castle提供者 Security.addProvider(new BouncyCastleProvider()); //生成公钥和私钥 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(256, new SecureRandom()); KeyPair keyPair = keyPairGenerator.generateKeyPair(); ECPublicKey ecPublicKey = (ECPublicKey)keyPair.getPublic(); ECPrivateKey ecPrivateKey = (ECPrivateKey)keyPair.getPrivate(); printBytes("Public key of ECC", ecPublicKey.getEncoded()); printBytes("Private key of ECC", ecPrivateKey.getEncoded()); //设置原文内容 byte[] plainBytes = "Hello, world.".getBytes(); printBytes("Plain bytes of ECC", plainBytes); //使用公钥进行加密 Cipher cipher = Cipher.getInstance("ECIES", "BC"); cipher.init(Cipher.ENCRYPT_MODE, ecPublicKey); byte[] encryptedBytes = cipher.doFinal(plainBytes); printBytes("Encrypted bytes of ECC", encryptedBytes); //使用私钥进行解密 cipher.init(Cipher.DECRYPT_MODE, ecPrivateKey); byte[] decryptedBytes = cipher.doFinal(encryptedBytes); printBytes("Decrypted bytes of ECC", decryptedBytes); } private static void printBytes(String prompt, byte[] bytes){ if (prompt == null || bytes == null){ return; } System.out.print(prompt + ":"); for (int i=0; i<bytes.length; i++){ System.out.printf(" %02X", bytes[i]); } System.out.println(); } }
运行程序,结果如下:
4、程序逻辑说明
上面示例程序的逻辑如下:
(1)添加Bouncy Castle提供者;
(2)生成ECC的公钥和私钥
Public key of ECC: 30 59 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 03 42 00 04 FA A7 3E 5B 07 8B 10 C1 2E 94 C3 4B CB 5B FB 8E 06 86 0C 58 F0 F0 35 2D A0 56 AE A7 42 4D 3F 4B A5 EB 08 05 3B DD 67 0A AC 45 B3 19 E3 70 C0 2C DB 8C 3C 88 13 7B 94 B4 E3 78 47 BB 0E 8D F2 99 Private key of ECC: 30 81 93 02 01 00 30 13 06 07 2A 86 48 CE 3D 02 01 06 08 2A 86 48 CE 3D 03 01 07 04 79 30 77 02 01 01 04 20 95 46 BD A7 8B CE 76 19 A3 DD 84 07 58 11 E3 AD 6E 96 E5 42 50 F9 2A EF 8D 6E 72 DC A8 41 F6 0F A0 0A 06 08 2A 86 48 CE 3D 03 01 07 A1 44 03 42 00 04 FA A7 3E 5B 07 8B 10 C1 2E 94 C3 4B CB 5B FB 8E 06 86 0C 58 F0 F0 35 2D A0 56 AE A7 42 4D 3F 4B A5 EB 08 05 3B DD 67 0A AC 45 B3 19 E3 70 C0 2C DB 8C 3C 88 13 7B 94 B4 E3 78 47 BB 0E 8D F2 99
(3)提供要加密的内容
Plain bytes of ECC: 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 2E(即“Hello, world.”)
(4)使用ECC公钥进行加密,得到密文
Encrypted bytes of ECC: 04 2B AE 7E 11 72 67 A0 82 38 A1 45 B2 27 24 2E 18 64 41 BC 71 EF 80 14 C4 F0 CD 6F 01 54 6F BE 81 7F 4C 90 54 A9 AA 78 4C 9C 34 1D 59 B4 C2 A0 FC 3D 8A 66 1E A6 CD 3C 39 E2 E5 E0 86 F2 8F 66 09 24 64 0D E8 FA 30 B4 67 AF DA F3 8C 8D CE B6 02 B5 4F A5 13 1C 4F 4F 82 D5 A6 71 B1 89 B0 C3 36 FF
(5)使用ECC私钥对密文进行解密,得到解密后的内容
Decrypted bytes of ECC: 48 65 6C 6C 6F 2C 20 77 6F 72 6C 64 2E(即“Hello, world.”)
可以看到,对明文加密后解密得到的内容,和明文一致,因此ECC算法使用正确。
5、文章还没有结束
上面的代码,使用的是公钥加密,私钥解开的方式,如果大家尝试私钥加密,公钥解开的方式,会发现程序抛异常:
异常怎么产生的呢?打开Bouncy Castle的源代码,一直跟踪到org.bouncycastle.jcajce.provider.asymmetric.ec.IESCipher类,发现了抛出异常的地方:
可以发现,如果使用Bouncy Castle的ECC IES算法,确实只能用公钥加密,私钥解密。
如何基于ECC实现“私钥加密,公钥解开”呢?这个问题先挂在这里,后面找到方法后再专门写一篇文章,感兴趣的读者也可以发表自己的意见。
如果你是非计算机专业,希望在互联网行业找到满意的工作,推荐一个Java培训课程:
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://haidsoft.com/168277.html