一、概述
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'));