資源簡介
1)利用C\C++語言實現DSA算法。
2)DSA中的Hash函數采用SHA算法。
(1)消息填充:因為我們存儲的時候是以字節為單位存儲的,所以消息的長度(單位:位)一定是 8 的倍數。而我們填充的時候也一定是 8 位、8 位地來填充。也即不可能只填充一個二進制位,至少是 8 個二進制位(一個字節)。因此最少填充 1 個字節,最多填充 64 個字節(64*8=512)。
在SHA1中,為了HASH小于2^64長度的輸入消息,先對消息m的長度進行處理,判斷補0后是512位的多少倍。
(2)大整數:因為涉及到幾百位的大整數運算,如這里規定p是512位,先封裝一個大整數類BigNumber,BigNumber的成員變量有sign, length, uint32_t number[MAXLENGTH], MAXLENGTH規定為128,也就是說這個BigNumber最多可以由128個uint32_t型的數拼起來。
2)DSA中的Hash函數采用SHA算法。
(1)消息填充:因為我們存儲的時候是以字節為單位存儲的,所以消息的長度(單位:位)一定是 8 的倍數。而我們填充的時候也一定是 8 位、8 位地來填充。也即不可能只填充一個二進制位,至少是 8 個二進制位(一個字節)。因此最少填充 1 個字節,最多填充 64 個字節(64*8=512)。
在SHA1中,為了HASH小于2^64長度的輸入消息,先對消息m的長度進行處理,判斷補0后是512位的多少倍。
(2)大整數:因為涉及到幾百位的大整數運算,如這里規定p是512位,先封裝一個大整數類BigNumber,BigNumber的成員變量有sign, length, uint32_t number[MAXLENGTH], MAXLENGTH規定為128,也就是說這個BigNumber最多可以由128個uint32_t型的數拼起來。

代碼片段和文件信息
#include
#include
#include
#include
#include
#include
#include
#include“sha1.h“
#include“BigNumber.h“
using?namespace?std;
#define?TEXTTIME?10
BigNumber?zero(0);
BigNumber?one(1);
BigNumber?ten(10);
BigNumber?sixteen(16);
BigNumber?NUMS[11]?=?{BigNumber((unsigned?int)(0))BigNumber((unsigned?int)(1))BigNumber(2)BigNumber(3)BigNumber(4)BigNumber(5)BigNumber(6)
BigNumber(7)BigNumber(8)BigNumber(9)BigNumber((unsigned?int)(10))};
BigNumber?BigNumber::operator=(BigNumber?a)
{
this->length?=?a.length;
this->sign?=?a.sign;
for?(int?i?=?0;?i? {
this->number[i]?=?a.number[i];
}
return?*this;
}
BigNumber?BigNumber::operator+(BigNumber?a)
{
BigNumber?c(0);
BigNumber::unsignedaddBigNumber(*this?a?c);
return?c;
}
BigNumber?BigNumber::operator-(BigNumber?a)
{
BigNumber?c(0);
BigNumber::unsignedsubBigNumber(*this?a?c);
return?c;
}
BigNumber?BigNumber::operator*(BigNumber?a)
{
BigNumber?c(0);
BigNumber::unsignedmulBigNumber(*this?a?c);
return?c;
}
BigNumber?BigNumber::operator/(BigNumber?a)
{
BigNumber?c(0);
BigNumber?d(0);
BigNumber::unsigneddivBigNumber(*this?a?c?d);
return?c;
}
BigNumber?BigNumber::operator%(BigNumber?a)
{
BigNumber?c(0);
BigNumber?d(0);
BigNumber::unsigneddivBigNumber(*this?a?c?d);
return?d;
}
/*向屏幕輸出無符號大整數*/
void?BigNumber::unsignedprintBigNumber()
{
stack?s; //c++容器?
BigNumber?remainder; //余數?
BigNumber?tmp?=?*this;
if?(BigNumber::unsignedisEqual(tmpzero))
{
cout?<0?< }
while?(!BigNumber::unsignedisEqual(tmp?zero))
{
remainder?=?tmp?%?ten;
tmp?=?tmp?/?ten;
s.push((unsigned?int)(remainder.number[0]));
}
while?(!s.empty())
{
cout?< s.pop();
}
cout?<}
/*根據string構建無符號大整數對象,n代表進制數*/
BigNumber::BigNumber(string?sint?n)
{
memset(BigNumber::number?0?MAXLENGTH*sizeof(uint32_t));
int?len?=?s.length();
BigNumber?resulttmp;
result?=?zero;
if?(n?==?10)
{ //十進制
for?(int?i?=?0;?i? {
if?(i?!=?0)
{
result?=?result?*?ten;
}
result?=?result?+?NUMS[int(s[i]?-?‘0‘)];
}
*this?=?result;
}
else?if?(n?==?2)
{ //二進制
for?(int?i?=?0;?i? {
if?(i?!=?0)
{
*this?=?*this*NUMS[2];
}
*this?=?*this?+?NUMS[int(s[i]?-?‘0‘)];
}
}
else?if(n==16) //留坑?
{
}
}
BigNumber::BigNumber(uint64_t?num)
{
memset(BigNumber::number?0?MAXLENGTH?*?sizeof(uint32_t));
if?(num?>>?32)
{ //num為64位
this->length?=?2;
this->number[0]?=?uint32_t(num&0x00000000ffffffff);
this->number[1]?=?uint32_t((num?>>?32)&0x00000000ffffffff);
}
else
{ //num為32位
this->length?=?1;
this->number[0]?=?uint32_t(num&0x00000000ffffffff);
}
}
BigNumber::BigNumber()
{
memset(BigNumber::number?0?MAXLENGTH?*?sizeof(uint32_t));
BigNumber::le
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件??????16324??2020-01-10?15:32??DSA\dsa-3\BigNumber.cpp
?????文件???????2503??2019-12-03?14:36??DSA\dsa-3\BigNumber.h
?????文件?????404650??2020-01-10?15:58??DSA\dsa-3\BigNumber.o
?????文件???????4566??2020-01-10?14:59??DSA\dsa-3\main.cpp
?????文件?????107780??2020-01-10?15:58??DSA\dsa-3\main.o
?????文件????????652??2019-11-25?21:56??DSA\dsa-3\plaintext.txt
?????文件???????4329??2020-01-08?22:10??DSA\dsa-3\sha1.c
?????文件????????527??2019-12-03?14:02??DSA\dsa-3\sha1.h
?????文件?????103659??2020-01-08?22:10??DSA\dsa-3\sha1.o
?????文件???????1404??2019-12-03?17:05??DSA\DSA-3.dev
?????文件????2353230??2020-01-10?15:58??DSA\DSA-3.exe
?????文件????????352??2020-01-10?21:57??DSA\DSA-3.layout
?????文件???????1428??2020-01-10?21:53??DSA\Makefile.win
?????文件????????652??2019-11-25?21:56??DSA\plaintext.txt
?????文件????????413??2020-01-10?21:53??DSA\private.txt
?????文件????????519??2020-01-10?21:53??DSA\public.txt
?????文件????????100??2020-01-10?21:53??DSA\signature.txt
?????文件????????704??2020-01-10?21:53??DSA\tmp
?????目錄??????????0??2020-01-10?15:58??DSA\dsa-3
?????目錄??????????0??2020-01-10?21:53??DSA
-----------?---------??----------?-----??----
??????????????3003792????????????????????20
評論
共有 條評論