ECC (加解密、ECDSA签证 代码收集整合)

package work.superstr;

import java.security.MessageDigest;  

import javax.crypto.KeyGenerator;  
import javax.crypto.Mac;  
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import sun.misc.BASE64Decoder;  
import sun.misc.BASE64Encoder;  
  
public abstract class Coder {  
    public static final String KEY_SHA = "SHA";  
    public static final String KEY_MD5 = "MD5";  
  
    /** 
     * MAC算法可选以下多种算法 
     *  
     * <pre> 
     * HmacMD5  
     * HmacSHA1  
     * HmacSHA256  
     * HmacSHA384  
     * HmacSHA512 
     * </pre> 
     */  
    public static final String KEY_MAC = "HmacMD5";  
  
    /** 
     * BASE64解密 
     *  
     * @param key 
     * @return 
     * @throws Exception 
     */  
    public static byte[] decryptBASE64(String key) throws Exception {  
        return (new BASE64Decoder()).decodeBuffer(key);  
    }  
  
    /** 
     * BASE64加密 
     *  
     * @param key 
     * @return 
     * @throws Exception 
     */  
    public static String encryptBASE64(byte[] key) throws Exception {  
        return (new BASE64Encoder()).encodeBuffer(key);  
    }  
  
    /** 
     * MD5加密 
     *  
     * @param data 
     * @return 
     * @throws Exception 
     */  
    public static byte[] encryptMD5(byte[] data) throws Exception {  
  
        MessageDigest md5 = MessageDigest.getInstance(KEY_MD5);  
        md5.update(data);  
  
        return md5.digest();  
  
    }  
  
    /** 
     * SHA加密 
     *  
     * @param data 
     * @return 
     * @throws Exception 
     */  
    public static byte[] encryptSHA(byte[] data) throws Exception {  
  
        MessageDigest sha = MessageDigest.getInstance(KEY_SHA);  
        sha.update(data);  
  
        return sha.digest();  
  
    }  
  
    /** 
     * 初始化HMAC密钥 
     *  
     * @return 
     * @throws Exception 
     */  
    public static String initMacKey() throws Exception {  
        KeyGenerator keyGenerator = KeyGenerator.getInstance(KEY_MAC);  
  
        SecretKey secretKey = keyGenerator.generateKey();  
        return encryptBASE64(secretKey.getEncoded());  
    }  
  
    /** 
     * HMAC加密 
     *  
     * @param data 
     * @param key 
     * @return 
     * @throws Exception 
     */  
    public static byte[] encryptHMAC(byte[] data, String key) throws Exception {  
  
        SecretKey secretKey = new SecretKeySpec(decryptBASE64(key), KEY_MAC);  
        Mac mac = Mac.getInstance(secretKey.getAlgorithm());  
        mac.init(secretKey);  
  
        return mac.doFinal(data);  
  
    }  
}  
package work.superstr;


import java.math.BigInteger;
import java.security.Key;
import java.security.KeyFactory;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.ECFieldF2m;
import java.security.spec.ECParameterSpec;
import java.security.spec.ECPoint;
import java.security.spec.ECPrivateKeySpec;
import java.security.spec.ECPublicKeySpec;
import java.security.spec.EllipticCurve;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
import java.util.HashMap;
import java.util.Map;

import javax.crypto.Cipher;
import javax.crypto.NullCipher;

import sun.security.ec.ECKeyFactory;
import sun.security.ec.ECPrivateKeyImpl;
import sun.security.ec.ECPublicKeyImpl;  
  
/** 
 * ECC安全编码组件 
 *  
 * @author 梁栋 
 * @version 1.0 
 * @since 1.0 
 */  
public abstract class ECCCoder extends Coder {  
  
    public static final String ALGORITHM = "EC";  
    private static final String PUBLIC_KEY = "ECCPublicKey";  
    private static final String PRIVATE_KEY = "ECCPrivateKey";  
  
    /** 
     * 解密<br> 
     * 用私钥解密 
     *  
     * @param data 
     * @param key 
     * @return 
     * @throws Exception 
     */  
    public static byte[] decrypt(byte[] data, String key) throws Exception {  
        // 对密钥解密  
        byte[] keyBytes = decryptBASE64(key);  
  
        // 取得私钥  
        PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(keyBytes);  
    
        KeyFactory keyFactory =KeyFactory.getInstance("EC");  
    
        ECPrivateKey priKey = (ECPrivateKey) keyFactory  
                .generatePrivate(pkcs8KeySpec);  
  
        ECPrivateKeySpec ecPrivateKeySpec = new ECPrivateKeySpec(priKey.getS(),  
                priKey.getParams());  
  
        // 对数据解密  
        // TODO Chipher不支持EC算法 未能实现  
        Cipher cipher = new NullCipher();  
        // Cipher.getInstance(ALGORITHM, keyFactory.getProvider());  
        cipher.init(Cipher.DECRYPT_MODE, priKey, ecPrivateKeySpec.getParams());  
  
        return cipher.doFinal(data);  
    }  
  
    /** 
     * 加密<br> 
     * 用公钥加密 
     *  
     * @param data 
     * @param privateKey 
     * @return 
     * @throws Exception 
     */  
    public static byte[] encrypt(byte[] data, String privateKey)  
            throws Exception {  
        // 对公钥解密  
        byte[] keyBytes = decryptBASE64(privateKey);  
  
        // 取得公钥  
        X509EncodedKeySpec x509KeySpec = new X509EncodedKeySpec(keyBytes);  
        KeyFactory keyFactory = KeyFactory.getInstance("EC") ;
  
        ECPublicKey pubKey = (ECPublicKey) keyFactory  
                .generatePublic(x509KeySpec);  
  
        ECPublicKeySpec ecPublicKeySpec = new ECPublicKeySpec(pubKey.getW(),  
                pubKey.getParams());  
  
        // 对数据加密  
        // TODO Chipher不支持EC算法 未能实现  
        Cipher cipher = new NullCipher();  
        // Cipher.getInstance(ALGORITHM, keyFactory.getProvider());  
        cipher.init(Cipher.ENCRYPT_MODE, pubKey, ecPublicKeySpec.getParams());  
  
        return cipher.doFinal(data);  
    }  
  
    /** 
     * 取得私钥 
     *  
     * @param keyMap 
     * @return 
     * @throws Exception 
     */  
    public static String getPrivateKey(Map<String, Object> keyMap)  
            throws Exception {  
        Key key = (Key) keyMap.get(PRIVATE_KEY);  
  
        return encryptBASE64(key.getEncoded());  
    }  
  
    /** 
     * 取得公钥 
     *  
     * @param keyMap 
     * @return 
     * @throws Exception 
     */  
    public static String getPublicKey(Map<String, Object> keyMap)  
            throws Exception {  
        Key key = (Key) keyMap.get(PUBLIC_KEY);  
  
        return encryptBASE64(key.getEncoded());  
    }  
  
    /** 
     * 初始化密钥 
     *  
     * @return 
     * @throws Exception 
     */  
    public static Map<String, Object> initKey() throws Exception {  
        BigInteger x1 = new BigInteger(  
                "2fe13c0537bbc11acaa07d793de4e6d5e5c94eee8", 16);  
        BigInteger x2 = new BigInteger(  
                "289070fb05d38ff58321f2e800536d538ccdaa3d9", 16);  
  
        ECPoint g = new ECPoint(x1, x2);  
  
        // the order of generator  
        BigInteger n = new BigInteger(  
                "5846006549323611672814741753598448348329118574063", 10);  
        // the cofactor  
        int h = 2;  
        int m = 163;  
        int[] ks = { 7, 6, 3 };  
        ECFieldF2m ecField = new ECFieldF2m(m, ks);  
        // y^2+xy=x^3+x^2+1  
        BigInteger a = new BigInteger("1", 2);  
        BigInteger b = new BigInteger("1", 2);  
  
        EllipticCurve ellipticCurve = new EllipticCurve(ecField, a, b);  
  
        ECParameterSpec ecParameterSpec = new ECParameterSpec(ellipticCurve, g,  
                n, h);  
        // 公钥  
        ECPublicKey publicKey = new ECPublicKeyImpl(g, ecParameterSpec);  
  
        BigInteger s = new BigInteger(  
                "1234006549323611672814741753598448348329118574063", 10);  
        // 私钥  
        ECPrivateKey privateKey = new ECPrivateKeyImpl(s, ecParameterSpec);  
  
        Map<String, Object> keyMap = new HashMap<String, Object>(2);  
  
        keyMap.put(PUBLIC_KEY, publicKey);  
        keyMap.put(PRIVATE_KEY, privateKey);  
  
        return keyMap;  
    }  
  
}  
package work.superstr;

import java.util.Map;  

/** 
 *  
 * @author 梁栋 
 * @version 1.0 
 * @since 1.0 
 */  
public class ECCCoderTest {  
	/**
	 * 公钥加密,私钥解密
	 * @throws Exception
	 */
	public static void test1() throws Exception {
		String inputStr = "abc";  
        byte[] data = inputStr.getBytes();  
  
        Map<String, Object> keyMap = ECCCoder.initKey();  
  
        String publicKey = ECCCoder.getPublicKey(keyMap);  
        String privateKey = ECCCoder.getPrivateKey(keyMap);  
        System.err.println("公钥: \n" + publicKey);  
        System.err.println("私钥: \n" + privateKey);  
  
        byte[] encodedData = ECCCoder.encrypt(data, publicKey);  
        byte[] decodedData = ECCCoder.decrypt(encodedData, privateKey);  
        
       
        String outputStr = new String(decodedData);  
        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);  
        System.out.println(inputStr.equals(outputStr));  
	}
	
	public static void test2() throws Exception {
		String inputStr = "abc";  
        byte[] data = inputStr.getBytes();  
  
        Map<String, Object> keyMap = ECCCoder.initKey();  
  
        String publicKey = ECCCoder.getPublicKey(keyMap);  
        String privateKey = ECCCoder.getPrivateKey(keyMap);  
        System.err.println("公钥: \n" + publicKey);  
        System.err.println("私钥: \n" + privateKey);  
  
        byte[] encodedData = ECCCoder.encrypt(data, privateKey);  
        byte[] decodedData = ECCCoder.decrypt(encodedData, publicKey);  
        
       
        String outputStr = new String(decodedData);  
        System.err.println("加密前: " + inputStr + "\n\r" + "解密后: " + outputStr);  
        System.out.println(inputStr.equals(outputStr));  
	}
    public static void main(String[] args ) throws Exception  {  
        test2();
    }  
}  
package work.superstr;

import java.security.KeyFactory;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.interfaces.ECPrivateKey;
import java.security.interfaces.ECPublicKey;
import java.security.spec.PKCS8EncodedKeySpec;
import java.security.spec.X509EncodedKeySpec;
 
/**
 * 椭圆曲线签名算法
 * 
 * 速度快 强度高 签名短
 * 
 * 实现方 JDK1.7/BC
 */
public class ECDSAUtil {
 
    private static String str = "hello";
 
    public static void main(String[] args) {
        jdkECDSA();
    }
 
    public static void jdkECDSA() {
        try {
            KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("EC");
            keyPairGenerator.initialize(256);
 
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            ECPublicKey ecPublicKey = (ECPublicKey) keyPair.getPublic();
            ECPrivateKey ecPrivateKey = (ECPrivateKey) keyPair.getPrivate();
 
            // 2.执行签名
            PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ecPrivateKey.getEncoded());
            KeyFactory keyFactory = KeyFactory.getInstance("EC");
 
            PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);
            Signature signature = Signature.getInstance("SHA1withECDSA");
            signature.initSign(privateKey);
 
            signature.update(str.getBytes());
            byte[] sign = signature.sign();
 
            // 验证签名
            X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ecPublicKey.getEncoded());
            keyFactory = KeyFactory.getInstance("EC");
            PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);
            signature = Signature.getInstance("SHA1withECDSA");
            signature.initVerify(publicKey);
            signature.update(str.getBytes());
            boolean bool = signature.verify(sign);
            System.out.println(bool);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
ECC(Elliptic Curves Cryptography,椭圆曲线加密)是一种公开密钥算法,用于加密和解密数据。下面是一个使用C语言实现ECC加解密算法的示例: ```c #include <stdio.h> #include <openssl/ec.h> #include <openssl/ecdsa.h> #include <openssl/obj_mac.h> #include <openssl/rand.h> int main() { // 创建椭圆曲线对象 EC_KEY *ec_key = EC_KEY_new_by_curve_name(NID_secp256k1); if (ec_key == NULL) { printf("Failed to create EC key\n"); return 1; } // 生成密钥对 if (EC_KEY_generate_key(ec_key) != 1) { printf("Failed to generate EC key pair\n"); EC_KEY_free(ec_key); return 1; } // 获取私钥 const BIGNUM *private_key = EC_KEY_get0_private_key(ec_key); // 获取公钥 const EC_POINT *public_key = EC_KEY_get0_public_key(ec_key); // 打印私钥 char *private_key_str = BN_bn2hex(private_key); printf("Private Key: %s\n", private_key_str); OPENSSL_free(private_key_str); // 打印公钥 char *public_key_str = EC_POINT_point2hex(EC_KEY_get0_group(ec_key), public_key, POINT_CONVERSION_UNCOMPRESSED, NULL); printf("Public Key: %s\n", public_key_str); OPENSSL_free(public_key_str); // 释放内存 EC_KEY_free(ec_key); return 0; } ``` 这个示例使用了OpenSSL库来实现ECC加解密算法。它首先创建了一个椭圆曲线对象,然后生成了一个密钥对,包括私钥和公钥。最后,它打印出私钥和公钥的十六进制表示。 请注意,这只是一个简单的示例,实际的ECC加解密算法可能涉及更多的步骤和参数设置。如果你想深入了解ECC算法的实现细节,建议参考相关的文档和资料。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值