java ecc 加密_java-信息安全(十一)-非对称加密算法002-ECC,签名003-ECDSA签名

本文详细介绍了Java中ECC加密算法的使用,包括JDK与BouncyCastle库的实现,以及ECDSA签名的步骤。文章还提到了Node.js环境下ECC算法的应用,并提供了相关代码示例,包括签名、验签、密钥交换和加密解密操作。
摘要由CSDN通过智能技术生成

一、概述

ECC算法(Elliptic curve cryptography,椭圆曲线密码学)

椭圆加密算法(ECC)是一种公钥加密体制,最初由Koblitz和Miller两人于1985年提出,其数学基础是利用椭圆曲线上的有理点构成Abel加法群上椭圆离散对数的计算困难性。

是目前已知的公钥体制中,对每比特所提供加密强度最高的一种体制。在软件注册保护方面起到很大的作用,一般的序列号通常由该算法产生。

ECDSA is a digital signature algorithm是一种数字签名算法

ECIES is an Integrated Encryption scheme 是一种集成加密方案

ECDH is a key secure key exchange algorithm是密钥安全密钥交换算法

1.1、jdk实现

ECC算法在jdk1.5后加入支持,目前仅仅只能完成密钥的生成与解析。

JDK1.7开始内置了ECC公私钥生成、签名验签,但没有实现加密解密。

jdk支持ecdsa、不支持ecdh、ecies

bc支持ecdsa、ecdh、ecies

1.2、bc实现【提供实现】

在Java中使用ECC算法有以下几点需要注意:

JDK1.7开始内置了ECC公私钥生成、签名验签,但没有实现加密解密,因此需要使用BouncyCastle来做Security Provider;

在Java中使用高级别的加解密算法,比如AES使用256bit密钥、ECC使用Secp256r1等需要更新JRE的security policy文件,否则会报类似“Illegal key size or default parameters”这样的错误。具体怎样更换policy文件,可以参考这里

实际项目开发过程中,可能发现有传递给Java的公钥不是完整的X.509 SubjectPublicKeyInfo,比如只传递了一个65字节的ECPoint过来,这种情况可以跟对方沟通清楚所使用的Algorithm以及NamedCurve,补全DER数据后,再使用Java Security库解析。

public classBcEcc {public static KeyPair initKeyPair(String algorithm, Integer keySize) throwsException {

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());

KeyPairGenerator keyPairGenerator= KeyPairGenerator.getInstance("EC","BC");

keyPairGenerator.initialize(keySize,newSecureRandom());

KeyPair keyPair=keyPairGenerator.generateKeyPair();returnkeyPair;

}public static byte[] encrypt(byte[] content, PublicKey publicKey) throwsException {

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());

Cipher cipher= Cipher.getInstance("ECIES","BC");//写不写 BC都可以,都是会选择BC实现来做

cipher.init(Cipher.ENCRYPT_MODE, publicKey);returncipher.doFinal(content);

}public static byte[] decrypt(byte[] content, PrivateKey privateKey) throwsException {

Security.addProvider(neworg.bouncycastle.jce.provider.BouncyCastleProvider());

Cipher cipher= Cipher.getInstance("ECIES","BC");

cipher.init(Cipher.DECRYPT_MODE, privateKey);returncipher.doFinal(content);

}

}

二、ECDSA签名

基于ECC与DSA签名算法分类信息,ECDSA(elliptic curve digital signature algorithm) 椭圆曲线数字签名算法:速度快,强度高,签名短

算法

密钥长度

默认长度

签名长度

实现的方

NONEwithECDSA

112-571

256

128

JDK/BC

RIPEMD160withECDSA

同上

256

160

BC

SHA1withECDSA

...

256

160

JDK/BC

SHA224withECDSA

...

256

224

JDK/BC

SHA256withECDSA

...

256

256

JDK/BC

SHA384withECDSA

...

256

384

JDK/BC

SHA512withECDSA

...

256

512

JDK/BC

签名示例

/algorithm-sign/algorithm-sign-impl/src/main/java/com/github/bjlhx15/security/sign003ecc

http://baike.baidu.com/item/%E6%A4%AD%E5%9C%86%E5%8A%A0%E5%AF%86%E7%AE%97%E6%B3%95/10305582?sefr=cr

三、nodejs版

crypto支持ecdsa、ecdh,不支持ecies加密解密

ecccrypto支持ecies加密解密

jsrsasign 使用

3.1、使用原生crypto 操作ecdsa、ecdh

无需安装类库模块

//原生crypto 支持 签名 验签 密钥交换//签名

functionecc_ecdsa_sign(signAlgorithmName, privateKey, srcData) {

const crypto= require('crypto');

const sign=crypto.createSign(signAlgorithmName);

sign.update(srcData);//注意这里是pkcs1, java后端默认是pkcs8

const private_key = '-----BEGIN EC PRIVATE KEY-----\n' +privateKey+

'-----END EC PRIVATE KEY-----\n';return sign.sign(private_key).toString('base64');

}//验签

functionecc_ecdsa_verify(signAlgorithmName, publicKey,sign, srcData) {//校验这里直接使用公钥,直接后端java生成的即可

const crypto = require('crypto');

const verify=crypto.createVerify(signAlgorithmName);

verify.update(srcData);//verify.update(new Buffer(srcData, 'utf-8'));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值