java 簽名 ecdsa_Java實現ECDSA簽名算法

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, ALGORITHM, 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", "1024" },

* { "DSA", "SHA256withDSA", "2048" }, { "RSA", "SHA256withRSA", "1024" },

* { "RSA", "SHA256withRSA", "2048" }, { "RSA", "SHA256withRSA", "3192" },

* { "RSA", "SHA512withRSA", "1024" }, { "RSA", "SHA512withRSA", "2048" },

* { "RSA", "SHA512withRSA", "3192" }, { "RSA", "MD5withRSA", "1024" },

* { "RSA", "MD5withRSA", "2048" },

* { "RSA", "MD5withRSA", "3192" }, { "EC", "SHA1withECDSA", "128" },

* { "EC", "SHA1withECDSA", "256" },

* { "EC", "SHA256withECDSA", "128" }, { "EC", "SHA256withECDSA", "256" },

* { "EC", "SHA512withECDSA", "128" }, { "EC", "SHA512withECDSA", "256" },

*

* @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,int bit) throws Exception {

if (Objects.isNull(keyPair)) {

keyPair = createKey(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 str, String publicKey,String algorithm,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簽名算法的資料請關注龍方網絡其它相關文章!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/534464.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/534464.shtml
英文地址,請注明出處:http://en.pswp.cn/news/534464.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

java異常處理方式推薦做法_談談Java異常處理這件事兒

此文已由作者謝蕾授權網易云社區發布。歡迎訪問網易云社區,了解更多網易技術產品運營經驗。前言我們對于“異常處理”這個詞并不陌生,眾多框架和庫在異常處理方面都提供了便利,但是對于何種處理才是最佳實踐,也是眾說紛紜。異常處…

as400和java的區別_文件傳輸協議和AS400

我目前收到以下錯誤:遠程服務器返回錯誤:(501)參數或參數中的語法錯誤 .我已經檢查了服務器并且文件確實存在,如果我打開命令提示符并鍵入以下代碼它可以工作:ftpopen 192.168.1.2cd /Imagesget S12345.jpeg這是正常的&#xff0c…

java中同時兩人提交數據_如何一起發送JSON請求和發布表單數據請求?

所以這是一個應該在POST請求中接受以下參數的API:token (as form data)apiKey (as form data){"notification": {"id": 1,"heading": "some heading","subheading": "some subheading","image&qu…

java 64內存不足_請教一個 Java 內存占用的問題

第 1 條附言 364 天前2020-03-04 01:08:55.525 [HikariPool-1 housekeeper] WARN c.z.hikari.pool.HikariPool - HikariPool-1 - Thread starvation or clock leap detected (housekeeper delta1m5s643ms48?s450ns).2020-03-04 01:09:08.516 [task-11] ERROR o.s.s.s.TaskU…

java 抽象類 final_final/抽象類/interface

lesson Thirteen                          2018-05-10 02:10:43final:最終的,可以修飾類、屬性、方法1.final修飾類:這個類就不能被繼承,如:String類,StringBuffer類,System類1…

java char i=2+#039;2#039;;_P039 二維數組的字符按列存放到字符串中 ★★

所屬年份:2010.9;2011.9;2012.3請編寫函數fun,該函數的功能是:將M行N列的二維數組中的字符數據,按列的順序依次放到一個字符串中。例如,若二維數組中的數據為W W W WS S S SH H H H則字符串中的內容應是:WSHWSHWSHWSH。#include#define M 3#d…

java io中斷_JDK源碼閱讀:InterruptibleChannel 與可中斷 IO

來源:木杉的博客 ,imushan.com/2018/08/01/java/language/JDK源碼閱讀-InterruptibleChannel與可中斷IO/Java傳統IO是不支持中斷的,所以如果代碼在read/write等操作阻塞的話,是無法被中斷的。這就無法和Thead的interrupt模型配合使…

java值棧_Struts2學習筆記-Value Stack(值棧)和OGNL表達式

只是本人的Struts2學習筆記,關于Value Stack(值棧)和OGNL表達式,把我知道的都說出來,希望對大家有用。一,值棧的作用記錄處理當前請求的action的數據。二,小例子有兩個action:Action1和Action2Action1有兩個…

php項目實戰流程_一個完整的php流程管理實例代碼分享

1. 添加新流程頁面:請選擇流程節點:session_start();include("../DBDA.class.php");$db new DBDA();$suser "select * from users";$auser $db->Query($suser);foreach($auser as $v){echo " {$v[2]} ";}?>$att…

php cdata,PHPcdata處理(詳細介紹)_PHP教程

PHPcdata處理(詳細介紹)_PHP教程當時在網上找了一個CDATA的轉換器, 修改之后, 將CDATA標簽給過濾掉。如下代碼如下:// States://// out// // // // // // // // in// ]// ]]//// (Yes, the states a represented by strings.)//$state out;$a s…

PHP 與go 通訊,Golang和php通信

不同語言之間的通信方式有很多種,這里我介紹一種最簡單通信方式,json-rpc。Golang自帶json-rpc包,使用起來十分簡單,示例如下,提供一個簡單echo server。package mainimport ("fmt""net""net…

php 接口日志,PHP 開發 APP 接口--錯誤日志接口

APP 上線以后可能遇到的問題:① APP 強退② 數據加載失敗③ APP 潛在問題錯誤日志需要記錄的內容數據表 error_log 字段:idapp_id:app 類別 iddid:客戶端設備號version_id:版本號version_mini:小版本號erro…

php 空模塊,tp5.1配置空模塊,空方法

config/app.php//默認的空模塊名empty_module>index,controller/Error.php<?php namespace app\index\controller;use Env;use think\Controller;class Error extends Controller {//Db::connect(db_ck)//全局MISS路由 在route.php里面設置找不到控制器默認處理//Route:…

centos7php自啟動,centos7系統下nginx安裝并配置開機自啟動操作

這篇文章主要介紹了centos7系統下nginx安裝并配置開機自啟動操作方法,非常不錯&#xff0c;具有參考借鑒價值&#xff0c;需要的朋友可以參考下這篇文章主要介紹了centos7系統下nginx安裝并配置開機自啟動操作方法,非常不錯&#xff0c;具有參考借鑒價值&#xff0c;需要的朋友…

時鐘php,php+js液晶時鐘

php代碼$size_small5;//液晶寬度$size_big25;//液晶長度$distance10;//間距$color_back"#DDDDDD";$color_dark"#CCCCCC";$color_light"#000000";$number0;?>Timer|www.ibtf.net|www.bitefu.netfunction swapcolor(obj,onoff)//改變顏色{if (…

r和matlab學哪個,初學者求教‘r*’是什么意思啊

該樓層疑似違規已被系統折疊 隱藏此樓查看此樓PLOT(X,Y,S) where S is a character string made from one elementfrom any or all the following 3 columns:b blue . point - solidg green o circle : dottedr red x x-mark -. dashdotc cyan plus -- dashedm magenta * star…

php swoole 心跳,聊聊swoole的心跳

來自&#xff1a;桶哥的一篇關于swoole的心跳的文章&#xff0c;作為Swoole顧問(顧得上就問,是為「顧問」)得推一下這篇文章&#xff0c;最后只留下一配置&#xff0c;其實我也不是太明白原理&#xff0c;我在想如果是局域網里還需要心跳&#xff1f;—————————————…

mysql 查詢 投影,MySql-連接查詢

連接查詢Chloe 友好支持多表連接查詢&#xff0c;一切都可以用 lambda 表達式操作&#xff0c;返回類型可以是自定義類型&#xff0c;也可以是匿名類型。強類型開發&#xff0c;編譯可見錯誤&#xff0c;容錯率高。1.建立連接&#xff1a;var user_city_province context.Quer…

php 遞歸欄目名疊加,thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法,thinkphp遞歸...

thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法&#xff0c;thinkphp遞歸本文實例講述了thinkPHP實現遞歸循環欄目并按照樹形結構無限極輸出的方法。分享給大家供大家參考&#xff0c;具體如下&#xff1a;這里使用thinkphp遞歸循環欄目按照樹形結構無限極輸出&#…

php cannot call constructor,安裝ECshop普遍問題的解決方法

安裝時的問題&#xff1a;1.Strict Standards: Non-static method cls_image::gd_version() should not be called statically in /usr/local/httpd2/htdocs/upload/install/includes/lib_installer.php on line 31解決&#xff1a;找到install/includes/lib_installer.php中的…