资源简介
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 < MAXLENGTH; 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 << endl;
}
while (!BigNumber::unsignedisEqual(tmp zero))
{
remainder = tmp % ten;
tmp = tmp / ten;
s.push((unsigned int)(remainder.number[0]));
}
while (!s.empty())
{
cout << s.top();
s.pop();
}
cout << endl;
}
/*根据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 < len; 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 < len; 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
相关资源
- 密码学 重合指数计算(IC.cpp)
- 扩展欧几里德算法c++代码
- 多表代换 加密解密 C语言实现
- DES算法C++实现.rar
- DES文件加密解密系统 密码学课设
- MMX-密码编码学:加密方法的C与C++实现
- DSA 数字签名 /C++/源代码
- 密码学:分组密码DES算法C语言版
- 密码学 模逆与模幂计算与应用 MFC实现
- 数字签名 /C++/源代码
- modscan32(可用于modbus 测试)
- 用C++模拟集中式密钥分配的过程
- 作业4 RSA和大数因式分解
- 密码学差分密码解密程序实现
- c语言实现国密SM2
- 密码学RSA 算法源码及大数运算的实现
- 用C语言实现的的全部的古典密码学算
- AES密码学课程设计带报告
- des差分攻击哦
- 用C语言实现SHA-1算法
- 维吉尼亚加密解密的C语言实现
- C语言实现计算乘法逆元
- 密码学快速取模指数算法C代码
- 简单的线性反馈移位寄存器LFSRC语言实
- 仿射加密现代密码学
- 软件学院密码学实验五
- 软件学院密码学实验四
- 软件学院密码学实验五sha
- 软件学院密码学实验四RSA
- 软件学院密码学实验三RC4
评论
共有 条评论