Java實現ECDSA簽名演算法
阿新 • • 發佈:2020-10-12
ECDSA簽名演算法
package com.albedo.security; /** * DSA 加解密實現 */ public class ECDSAUtils extends Base { //字元編碼 public static final String ALGORITHM = "EC"; public static final String SIGN_ALGORITHM = "SHA1withECDSA"; /** * ECDSA 驗籤 * * @param sign 加密簽名 * @param str 加密字串 * @param publicKey 公鑰 * @return 密文 * @throws Exception 加密過程中的異常資訊 */ public static boolean verify(String sign,String str,String publicKey) throws Exception { return verify(sign,str,publicKey,ALGORITHM,SIGN_ALGORITHM); } /** * ECDSA 簽名 * * @param str 加密字串 * @param privateKey 私鑰 * @return 銘文 * @throws Exception 解密過程中的異常資訊 */ public static String sign(String str,String privateKey) throws Exception { return sign(str,privateKey,SIGN_ALGORITHM); } public static void main(String[] args) throws Exception { String publicKey = getPublicKey(ALGORITHM,512); String privateKey = getPrivateKey(ALGORITHM,512); String message = "我要測試DSA"; String sign = sign(message,privateKey); System.out.println(verify(sign,message,publicKey)); } }
基礎程式碼
package com.albedo.security; import com.albedo.num.ByteUtils; 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.spec.PKCS8EncodedKeySpec; import java.security.spec.X509EncodedKeySpec; import java.util.Objects; class Base { static KeyPair keyPair; /** * 生成金鑰實際方法,可以使用多種方式 * 一篇文件提供一下多種方式 * { "DSA","SHA1withDSA","1024" },{ "DSA","SHA256withDSA",* { "DSA","2048" },{ "RSA","SHA256withRSA",* { "RSA","3192" },"SHA512withRSA","MD5withRSA",{ "EC","SHA1withECDSA","128" },* { "EC","256" },"SHA256withECDSA","SHA512withECDSA",* * @param algorithm * @param bit * @return * @throws Exception */ protected static KeyPair createKey(String algorithm,int bit) throws Exception { KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance(algorithm); keyPairGenerator.initialize(bit); KeyPair keyPair = keyPairGenerator.generateKeyPair(); return keyPair; } /** * 獲取公鑰 * * @return * @throws Exception */ public static String getPublicKey(String algorithm,int bit) throws Exception { if (Objects.isNull(keyPair)) { keyPair = createKey(algorithm,bit); } return ByteUtils.byteArr2HexStr(keyPair.getPublic().getEncoded()); } /** * 獲取私鑰 * * @return * @throws Exception */ public static String getPrivateKey(String algorithm,bit); } return ByteUtils.byteArr2HexStr(keyPair.getPrivate().getEncoded()); } /** * 非對稱加密簽名 * @param str * @param privateKey * @param algorithm * @param signAlgorithm * @return * @throws Exception */ public static String sign(String str,String privateKey,String algorithm,String signAlgorithm) throws Exception { PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(ByteUtils.hexstr2ByteArr(privateKey)); KeyFactory keyFactory = KeyFactory.getInstance(algorithm); PrivateKey dsaPrivateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec); Signature signature = Signature.getInstance(signAlgorithm); signature.initSign(dsaPrivateKey); signature.update(str.getBytes()); return ByteUtils.byteArr2HexStr(signature.sign()); } /** * 非對稱加密驗證 * @param sign * @param str * @param publicKey * @param algorithm * @param signAlgorithm * @return * @throws Exception */ public static boolean verify(String sign,String publicKey,String signAlgorithm) throws Exception { //base64編碼的公鑰 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(ByteUtils.hexstr2ByteArr(publicKey)); KeyFactory keyFactory = KeyFactory.getInstance(algorithm); PublicKey dsaPublicKey = keyFactory.generatePublic(x509EncodedKeySpec); Signature signature = Signature.getInstance(signAlgorithm); signature.initVerify(dsaPublicKey); signature.update(str.getBytes()); return signature.verify(ByteUtils.hexstr2ByteArr(sign)); } }
以上就是Java實現ECDSA簽名演算法的詳細內容,更多關於Java ECDSA簽名演算法的資料請關注我們其它相關文章!