【转】ECC加密算法简介

原文链接:https://blog.csdn.net/xuanli4845/article/details/115907886

ECC全称为“Ellipse Curve Ctyptography”,是一种基于椭圆曲线数学的公开密钥加密算法。椭圆曲线在密码学中的使用是在1985年由Neal Koblitz和Victor Miller分别独立提出的。

与传统的基于大质数分解难题的加密算法不同,该加密方式基于 “离散对数” 这种数学难题。

ECC主要优势是可以使用更小的密钥并提供相当高等级的安全。

ECC164位的密钥产生一个安全级,相当于RSA 1024位密钥提供的保密强度,而且计算量较小,处理速度更快,存储空间和传输带宽占用较少。

目前我国居民二代身份证正在使用 256 位的椭圆曲线密码,虚拟货币比特币也选择ECC作为加密算法。

ECC加密算法原理介绍


ECC也是使用了正向运算很简单,但是反向运算很难的单向函数,但是和RSA的原理不同,RSA使用的时模函数作为单向函数,而ECC是建立在基于椭圆曲线的离散对数问题上的密码体制,给定椭圆曲线上的一个点G,并选取一个整数k,求解K=kG很容易(注意根据kG求解出来的K也是椭圆曲线上的一个点);反过来,在椭圆曲线上给定两个点K和G,若使K=kG,求整数k是一个难题。

ECC就是建立在此数学难题之上,这一数学难题称为椭圆曲线离散对数问题。其中椭圆曲线上的点K则为公钥(注意公钥K不是一个整数而是一个椭圆曲线点),整数k则为私钥(实际上是一个大整数)。

ECC加密算法优缺点:
1.优点
对于ECC加密算法的优点,那就是性能上的提升,同样的密钥长度,基于ECC加密要比基于RSA安全很多。对于安全多少呢,可能需要一个量化的概念来证明ECC究竟有多强。那我们以碳排放量作为量化标准。

同样是228字节的私钥,使用RSA加密算法加密之后进行破解的话,可能只需要煮沸一勺水的碳排放。但是使用ECC加密之后进行破解的话,就可能需要煮沸一整个地球的水的碳排放。

2.缺点
前面我们介绍了ECC算法的优势,但是它真的有那么强么?其实它也仍存在几个方面的缺陷,要不然凭借ECC的优势估计早已席卷全球,还有RSA什么事儿呢?
第一个缺点是:它是基于椭圆曲线的离散对数问题,这并不是一个很好理解的问题,这里的椭圆曲线实际上并不是一个真正意义的椭圆,它的运算和椭圆类似,实际上是一个随着参数变化而不断变化的曲线,不同参数的选取会出现不同的曲线,不同的曲线就会形成不用的ECC标准,不同标准的ECC产生的加解密效果也是千差万别的。所以第一个缺陷就是曲线的选择很复杂。

第二个缺陷是:有没有可能这条复杂的曲线被人植入了后门呢,然后别人就可以通过这个后门轻松的破解。现行的一套很流行的ECC标准是由美国郭建安全局NAS发布的,这个标准就被很多人质疑是有被植入了后门的。

第三个缺陷就是专利之争。关于ECC的使用,很多人申请了很多的专利,现在关于ECC使用的专利大多数都掌握在一家公司的手中,这家公司就是黑莓,就是产手机的那个黑莓。所以,当你想要构建自己的一套ECC标准的时候,可能不知道哪里就触及了它们的专利,卷入专利之争。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是使用Java实现ECC加密算法的示例代码: ```java import java.security.KeyPair; import java.security.KeyPairGenerator; import java.security.PrivateKey; import java.security.PublicKey; import java.security.Security; import java.security.Signature; import org.bouncycastle.jce.provider.BouncyCastleProvider; import org.bouncycastle.util.encoders.Hex; public class ECCDemo { public static void main(String[] args) throws Exception { Security.addProvider(new BouncyCastleProvider()); // 生成密钥对 KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC", "BC"); keyPairGenerator.initialize(256); KeyPair keyPair = keyPairGenerator.generateKeyPair(); PrivateKey privateKey = keyPair.getPrivate(); PublicKey publicKey = keyPair.getPublic(); // 显示密钥对 System.out.println("Private key: " + Hex.toHexString(privateKey.getEncoded())); System.out.println("Public key: " + Hex.toHexString(publicKey.getEncoded())); // 签名 Signature signature = Signature.getInstance("SHA256withECDSA", "BC"); signature.initSign(privateKey); byte[] message = "Hello, world!".getBytes(); signature.update(message); byte[] signatureBytes = signature.sign(); System.out.println("Signature: " + Hex.toHexString(signatureBytes)); // 验证签名 signature.initVerify(publicKey); signature.update(message); boolean verified = signature.verify(signatureBytes); System.out.println("Verified: " + verified); } } ``` 该示例代码使用Bouncy Castle库实现了ECC加密算法,包括生成密钥对、签名和验证签名等操作。其中,生成密钥对使用256位的椭圆曲线,签名算法使用SHA256withECDSA。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小金子的夏天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值