1. 程式人生 > >ecdsa 橢圓曲線數字簽名演算法

ecdsa 橢圓曲線數字簽名演算法

來源:http://www.cryptopp.com/wiki/Elliptic_Curve_Digital_Signature_Algorithm

Elliptic Curve Digital Signature Algorithm, 或者 ECDSA, 是 FIPS-186. 定義的一種數字簽名方法,當前版本是 Change 3, dated June 2009. 如果對非橢圓曲線變種有興趣,看數字簽名演算法(Digital Signature Algorithm.)

當這些操作,比如說產生密匙,簽名,驗證可以進行,我們必須選擇一個場和一個合適的域引數, 基於演示的目的,這個例子使用Fp 作為場. 這意味著一個這個模板引數必須包含

ECP.如果我們使用 F2m, 那麼模板引數就是 EC2N.

Crypto++ 提供了一些ANSI, Brainpool, and NIST提倡使用的曲線. Crypto++ 沒有使用曲線產生功能,如果你需要使用自定義曲線,看 Elliptic Curve Builder.

測試程式碼

using namespace CryptoPP;

int Cecdsa_testDlg::test1(void)
{
	AutoSeededRandomPool prng;
	FileSource fs1( "private.ec.der", true /*pump all*/ );
	FileSource fs2( "public.ec.der", true /*pump all*/ );
	ECDSA<ECP, SHA256>::PrivateKey privateKey;
	ECDSA<ECP, SHA256>::PublicKey publicKey;
	// Load private key in PKCS #8 format
	privateKey.Load( fs1 );
	publicKey.Load(fs2);

	bool result = privateKey.Validate( prng, 3 );
	if( !result ) { return 1; }

	ECDSA<ECP, SHA256>::Signer signer(privateKey);

	std::string message = "Do or do not. There is no try.";
//	signer.AccessKey().Initialize( prng, ASN1::secp160r1() );

	// Determine maximum size, allocate a string with the maximum size
	size_t siglen = signer.MaxSignatureLength();
	std::string signature(siglen, 0x00);

	// Sign, and trim signature to actual size
	siglen = signer.SignMessage( prng, (const byte *)message.data(), message.size(), (byte *)signature.data() );
	signature.resize(siglen);


	ECDSA<ECP, SHA256>::Verifier verifier(publicKey);

	result = verifier.VerifyMessage( (const byte*)message.data(), message.size(), (const byte*)signature.data(), signature.size() );
	if(result)
		std::cout << "Verified signature on message" << std::endl;
	else
		std::cerr << "Failed to verify signature on message" << std::endl;
	return 0;
}


int Cecdsa_testDlg::test2(void)
{
	// Generating private/public pair
	AutoSeededRandomPool rng;
	//Generate a private key
	ECDSA<ECP, CryptoPP::SHA256>::PrivateKey privateKey;
	privateKey.Initialize(rng, CryptoPP::ASN1::secp256r1());

	bool result = privateKey.Validate( rng, 3 );
	if( !result ) { return 1; }

	// Save private key in PKCS #8 format
	FileSink fs1( "private.ec.der", true /*binary*/ );
	privateKey.Save( fs1 );

	// Generate publicKey
	ECDSA<ECP, CryptoPP::SHA256>::PublicKey publicKey;
	privateKey.MakePublicKey(publicKey);

	// Save public key in X.509 format
	FileSink fs2( "public.ec.der", true /*binary*/ );
	publicKey.Save( fs2 );

	// Serializing keys for later use
	std::string tmp;
	StringSink sink(tmp);
	publicKey.Save(sink);

	std::string out;
	StringSource(tmp, true, new Base32Encoder(new StringSink(out)));

	std::cout << out << std::endl; // <-- This prints full public key, same thing	with private one

#if 0

	// Loading private key and signing something
	std::string privateKeyStr = "base32 encoded private key here";

	ECIES<ECP>::PrivateKey privateKey;
	ByteQueue bq;
	StringSource(privateKeyStr, true, new Base32Decoder(new
		Redirector(bq)));
	privateKey.Load(bq);

	AutoSeededRandomPool rng;
	ECDSA<ECP>::Signer signer(privateKey);
	std::string out;
	std::string message = "message to sign, bla bla";
	StringSource(message, true, new SignerFilter(rng, signer, new
		Base32Encoder(new StringSink(out))));

	std::cout << out << std::endl; // <-- this is base32 encoded signature for the	message




		// Loading public key and verifying signature
	std::string publicKeyStr = "base32 encoded public key here";
	ECIES<ECP>::PublicKey publicKey;

	ByteQueue bq;
	StringSource source(key, true, new Base32Decoder(new Redirector(bq)));
	publicKey.Load(bq);

	std::string message="message to sign, bla bla";
	std::string signature32="base32 encoded signature";

	std::string signature;
	StringSource(signature32, true, new Base32Decoder(new
		StringSink(signature)));

	ECDSA<ECP>::Verifier verifier(publicKey);
	if(verifier.VerifyMessage((const byte*)message.data(), message.size(),
		(const byte*)signature.data(), signature.size()))
	{
		// Valid
	}
#endif
	return 0;
}


相關推薦

區塊鏈教程Fabric1.0原始碼分析ECDSA橢圓曲線數字簽名演算法

  兄弟連區塊鏈教程Fabric1.0原始碼分析ECDSA橢圓曲線數字簽名演算法,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 Fabric 1.0原始碼筆記 之 ECDS

ecdsa 橢圓曲線數字簽名演算法

來源:http://www.cryptopp.com/wiki/Elliptic_Curve_Digital_Signature_Algorithm Elliptic Curve Digital Signature Algorithm, 或者 ECDSA, 是 FIPS

46.Fabric 1.0原始碼分析(46)ECDSA橢圓曲線數字簽名演算法

Fabric 1.0原始碼筆記 之 ECDSA(橢圓曲線數字簽名演算法) 1、橢圓曲線演算法概述 1.1、無窮遠點、無窮遠直線、射影平面 平行線相交於無窮遠點; 直線上有且只有一個無窮遠點; 一組相互平行的直線有公共的無窮遠點; 平面上任何相交的兩直線,有不同

Fabric 1.0原始碼分析(46)ECDSA橢圓曲線數字簽名演算法

# Fabric 1.0原始碼筆記 之 ECDSA(橢圓曲線數字簽名演算法)## 1、橢圓曲線演算法概述### 1.1、無窮遠點、無窮遠直線、射影平面* 平行線相交於無窮遠點;* 直線上有且只有一個無窮遠點;* 一組相互平行的直線有公共的無窮遠點;* 平面上任何相交的兩直線,有不同的無窮遠點;* 全部無窮遠點

區塊鏈教程Fabric1.0源代碼分析ECDSA橢圓曲線數字簽名算法

發展 rand big 區塊 相關 point 不同 正是 nature 兄弟連區塊鏈教程Fabric1.0源代碼分析ECDSA橢圓曲線數字簽名算法,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、回歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡

密碼學07--數字簽名之go中的橢圓曲線數字簽名

目錄 1.ECC 1.1 簡介 1.2 GO語言中的ECC說明 1.3 Go語言中的ECC相關 1.4 Go語言中的ECC數字簽名流程 1.4.1 ECDSA金鑰對生成 1.4.2 ECDSA金鑰對本地化 1.4.3 ECDSA私鑰數字簽名 1

SM2演算法第二十五篇:ECDSA數字簽名演算法原理與實現

---------------------------------------------轉載原因------------------------------------------------- 這邊部落格中有關 EC_KEY_set_private_key和EC_KEY_set_public_key

多重數字簽名演算法

什麼是數字簽名? 數字簽名就是附加在資料單元上的一些資料,或是對資料單元所作的密碼變換。 這裡的數字簽名,不是簡單的把紙質的簽名改為電子簽名,我們需要知道的是,數字簽名包含兩點:一是保證資訊傳輸的完整性,防止其在途中被篡改;二是保證傳送者的身份認證,防止其抵賴。在學習數字簽名之前,我們先介紹

數字簽名演算法

數字簽名演算法主要包含RSA、DSA、ECDSA三種演算法 1. 它的訊息傳遞操作是: 由訊息傳送方構建密匙對, 由訊息傳送的一方公佈公鑰至訊息接收方, 訊息傳送方對訊息用私鑰做簽名處理 訊息接收方用公鑰對訊息做驗證 2. RSA簽名演算法主要分為

國密SM2數字簽名演算法

SM2是基於橢圓曲線的數字簽名演算法,關於橢圓曲線的解釋可以常見前一篇關於橢圓曲線的微博,下面概要的介紹一下SM2簽名的過程。 對於要簽名的資訊e,這個是原始資訊經過一定的處理通過雜湊函式得到的,雜湊演算法用的是國密SM3演算法,這個過程也略過,只介紹重點的簽

比特幣錢包地址的概念以及SHA256和橢圓曲線乘法加密演算法的詳解

比特幣錢包,金鑰,地址 錢包就是金鑰所在之處,錢包是私鑰的容器,通過有序檔案或者簡單的資料庫實現或者用原有的私鑰通過單向雜湊函式生成每一個新的私鑰,並將新的金鑰順序連線。 比特幣錢包包含的是私鑰而不是比特幣,一個使用者可以有一個或者多個私鑰的錢包,錢包中含有成對的私鑰和公鑰

數字簽名演算法MD5和SHA-1的比較

什麼是MD5,什麼是SHA-1,如何校驗這些Hash。還有拿單個ISO檔案的MD5,SHA-1訊問是不是原版的問題,在這裡,對以上問題做一個終結解釋!瞭解hashHash,一般翻譯做“雜湊”,也有直接音譯為”雜湊”的,就是把任意長度的輸入(又叫做預對映,pre-image),

Java 數字簽名演算法RSA 的使用教程

JAVA 20小時前 36瀏覽 0評論 最近用到了 RSA 演算法,百度了一下,發現很多文章都是互相轉載的。有的實現太過複雜,有的完全沒有中心,是錯誤的實現。今天小編就特意為大家整理了一下 java 使用 RSA 演算法的案例,希望能對大家有所幫助! 關於 RSA

數字簽名演算法的具體使用測試

 程式碼: RSAUtils.java package com.util; import java.io.ByteArrayOutputStream; import java.security.Key; import java.security.KeyFacto

.NET Core加解密實戰系列之——訊息摘要與數字簽名演算法

![](https://img2020.cnblogs.com/blog/2029875/202006/2029875-20200629172528304-1596961448.png) --- [TOC] ## 簡介 加解密現狀,編寫此係列文章的背景: - 需要考慮系統環境相容性問題(Linux、W

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、base58實現

go實現橢圓曲線加解密、簽名驗證演算法(go ecdsa庫的運用),及生成比特幣地址過程講解、BASE58實現 前言 本文主要講解使用Go的ecdsa庫實現橢圓曲線加解密、簽名、驗證演算法,同時通過公鑰生成比特幣地址,具體程式碼邏輯參考bitcoin0

區塊鏈教程區塊鏈資訊保安3橢圓曲線加解密及簽名演算法的技術原理一

  區塊鏈教程區塊鏈資訊保安3橢圓曲線加解密及簽名演算法的技術原理一,2018年下半年,區塊鏈行業正逐漸褪去發展之初的浮躁、迴歸理性,表面上看相關人才需求與身價似乎正在回落。但事實上,正是初期泡沫的漸退,讓人們更多的關注點放在了區塊鏈真正的技術之上。 橢圓曲線加解密及簽名演算法的技術原理及其Go語言實現

ECC橢圓曲線ECDSA簽名驗籤和ECIES加解密

ECC橢圓曲線詳解前言ECC英文全稱"Ellipse Curve Cryptography",與傳統的基於大質數因子分解困難性的加密方法不同,ECC通過橢圓曲線方程式的性質產生金鑰ECC164位的金鑰產生一個安全級,相當於RSA 1024位金鑰提供的保密強度,而且計算量較小,

數字簽名加密演算法(RSA、DSA、ECDSA

RSA的例子: import java.security.KeyFactory; import java.security.KeyPair; import java.security.KeyPairGenerator; import java.securi

區塊鏈背後的資訊保安(3)橢圓曲線加解密及簽名演算法的技術原理及其Go語言實現

# 橢圓曲線加解密及簽名演算法的技術原理及其Go語言實現橢圓曲線加密演算法,即:Elliptic Curve Cryptography,簡稱ECC,是基於橢圓曲線數學理論實現的一種非對稱加密演算法。相比RSA,ECC優勢是可以使用更短的金鑰,來實現與RSA相當或更高的安全。據研究,160位ECC加密安全性相當