数字签名算法消息传递模型

  1. 由消息发送方构建密钥对,这里由甲方完成。
  2. 由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方。

  1. 注意如加密算法区别,这里甲方使用私钥对数据签名,数据与签名形成一则消息发送给乙方,私钥仅用于签名,公钥仅用于验证。

RSA

RSA数字签名算法源于RSA公钥密码算法的思想,将RSA公钥密码算法按照数字签名的方式运用。RSA数字签名算法是迄今为止应用最为广泛的数字签名算法。 RSA数字签名算法的实现如RSA加密算法一致。RSA数字签名算法主要可分为MD系列和SHA系列。

  1. MD系列主要包括:MD2withRSA和MD5withRSA。
  2. SHA系列主要包括:SHA1withRSA,SHA224withRSA,�SHA256withRSA,SHA384withRSA,SHA512withRSA。

Java 6提供了MD2withRSA,MD5withRSA,SHA1withRSA支持,其他四中SHA算法第三方加密组建包Bouncy Castle提供支持。

签名过程:

过程:

1)消息发送者产生一个密钥对(私钥+公钥),然后将公钥发送给消息接收者

2)消息发送者使用消息摘要算法对原文进行加密(加密后的密文称作摘要)

3)消息发送者将上述的摘要使用私钥加密得到密文--这个过程就被称作签名处理,得到的密文就被称作签名(注意,这个签名是名词)

4)消息发送者将原文与密文发给消息接收者

5)消息接收者使用公钥对密文(即签名)进行解密,得到摘要值content1

6)消息接收者使用与消息发送者相同的消息摘要算法对原文进行加密,得到摘要值content2

7)比较content1是不是与content2相等,若相等,则说明消息没有被篡改(消息完整性),也说明消息却是来源于上述的消息发送方(因为其他人是无法伪造签名的,这就完成了“抗否认性”和“认证消息来源”)

RSA: 加密原理

RSA-Algorithm

RSA算法演示程序,仅供了解RSA算法实现原理

RSA算法原理

  • 找出两个"很大"的质数:P & Q
  • N = P * Q
  • M = (P - 1) * (Q - 1)
  • 找出整数E,E与M互质,即除了1之外,没有其他公约数
  • 找出整数D,使得E*D除以M余1,即 (E * D) % M = 1

经过上述准备工作之后,可以得到:

  • E是公钥,负责加密
  • D是私钥,负责解密
  • N负责公钥和私钥之间的联系
  • 加密算法,假定对X进行加密
    • (X ^ E) % N = Y
  • 根据费尔马小定义,根据以下公式可以完成解密操作
    • (Y ^ D) % N = X

RSA本身算法的核心思想还是比较简单的,加密、解密算法的区别也只是在乘方取模部分使用的数字有所区别而已

当然,实际运用要比示例代码复杂得多,由于RSA算法的公钥私钥的长度(模长度)要到1024位甚至2048位才能保证安全, 因此,P、Q、E的选取,公钥、私钥的生成,加密、解密模指数运算都有一定的计算程序,需要依托计算机高速运算来完成。

公开密钥的好处

  • 简单 就是一些乘除而已
  • 可靠 可以保证产生的密文是统计独立,并且分布均匀的,也就是说:
    • 不论给出多少份明文和对应的密文,也无法根据已知的明文和密文的对应关系,破译出下一份密文
    • N和E可以公开给任何人加密使用,但是只有掌握密钥D的人才可以解密,即使加密者自己也无法解密
  • 灵活 可以产生很多的公钥E和私钥D的组合给不同的加密者

测试数据说明

P = 11;
Q = 13;
N = 143;
M = 120; E = 89;
D = 209;

提示:本示例程序仅用于演示,N的数值只有143,能够加密的字符范围有限。

一个C++实现的算法:

using namespace std;

int Plaintext[100];//明文
long long Ciphertext[100];//密文
int n, e = 0, d; //二进制转换
int BianaryTransform(int num, int bin_num[])
{ int i = 0, mod = 0; //转换为二进制,逆向暂存temp[]数组中
while(num != 0)
{
mod = num%2;
bin_num[i] = mod;
num = num/2;
i++;
} //返回二进制数的位数
return i;
} //反复平方求幂
long long Modular_Exonentiation(long long a, int b, int n)
{
int c = 0, bin_num[1000];
long long d = 1;
int k = BianaryTransform(b, bin_num)-1; for(int i = k; i >= 0; i--)
{
c = 2*c;
d = (d*d)%n;
if(bin_num[i] == 1)
{
c = c + 1;
d = (d*a)%n;
}
}
return d;
} //生成1000以内素数
int ProducePrimeNumber(int prime[])
{
int c = 0, vis[1001];
memset(vis, 0, sizeof(vis));
for(int i = 2; i <= 1000; i++)if(!vis[i])
{
prime[c++] = i;
for(int j = i*i; j <= 1000; j+=i)
vis[j] = 1;
} return c;
} //欧几里得扩展算法
int Exgcd(int m,int n,int &x)
{
int x1,y1,x0,y0, y;
x0=1; y0=0;
x1=0; y1=1;
x=0; y=1;
int r=m%n;
int q=(m-r)/n;
while(r)
{
x=x0-q*x1; y=y0-q*y1;
x0=x1; y0=y1;
x1=x; y1=y;
m=n; n=r; r=m%n;
q=(m-r)/n;
}
return n;
} //RSA初始化
void RSA_Initialize()
{
//取出1000内素数保存在prime[]数组中
int prime[5000];
int count_Prime = ProducePrimeNumber(prime); //随机取两个素数p,q
srand((unsigned)time(NULL));
int ranNum1 = rand()%count_Prime;
int ranNum2 = rand()%count_Prime;
int p = prime[ranNum1], q = prime[ranNum2]; n = p*q; int On = (p-1)*(q-1); //用欧几里德扩展算法求e,d
for(int j = 3; j < On; j+=1331)
{
int gcd = Exgcd(j, On, d);
if( gcd == 1 && d > 0)
{
e = j;
break;
} } } //RSA加密
void RSA_Encrypt()
{
cout<<"Public Key (e, n) : e = "<<e<<" n = "<<n<<'\n';
cout<<"Private Key (d, n) : d = "<<d<<" n = "<<n<<'\n'<<'\n'; int i = 0;
for(i = 0; i < 100; i++)
Ciphertext[i] = Modular_Exonentiation(Plaintext[i], e, n); cout<<"Use the public key (e, n) to encrypt:"<<'\n';
for(i = 0; i < 100; i++)
cout<<Ciphertext[i]<<" ";
cout<<'\n'<<'\n';
} //RSA解密
void RSA_Decrypt()
{
int i = 0;
for(i = 0; i < 100; i++)
Ciphertext[i] = Modular_Exonentiation(Ciphertext[i], d, n); cout<<"Use private key (d, n) to decrypt:"<<'\n';
for(i = 0; i < 100; i++)
cout<<Ciphertext[i]<<" ";
cout<<'\n'<<'\n';
} //算法初始化
void Initialize()
{
int i;
srand((unsigned)time(NULL));
for(i = 0; i < 100; i++)
Plaintext[i] = rand()%1000; cout<<"Generate 100 random numbers:"<<'\n';
for(i = 0; i < 100; i++)
cout<<Plaintext[i]<<" ";
cout<<'\n'<<'\n';
} int main()
{
Initialize(); while(!e)
RSA_Initialize(); RSA_Encrypt(); RSA_Decrypt(); return 0;
}

  应该是私钥加密,公钥解密的。

Ref:

http://wzhong.logdown.com/posts/234502-rsa-c

https://github.com/liufan321/RSA-Algorithm

数字签名算法--RSA

https://github.com/LexHsu/Summary/blob/master/02-Algorithm/book/5.1-rsa.md#数字签名算法消息传递模型

数字签名算法rsa的更多相关文章

  1. Java数字签名算法--RSA

    签名具有的特性: 安全性 抗否认性 数字签名:带有密钥(公钥.私钥)的消息摘要算法(使用私钥进行签名,使用公钥进行验证) 数字签名算法:RSA.DSA.ECDSA 数字签名特性: 验证数据完整性 认证 ...

  2. 第十四章 数字签名算法--RSA

    注意:本节内容主要参考自 <Java加密与解密的艺术(第2版)>第9章“带密钥的消息摘要算法--数字签名算法” <大型分布式网站架构(设计与实践)>第3章“互联网安全架构” 1 ...

  3. ECDSA数字签名算法

    一.ECDSA概述 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线密码(ECC)对数字签名算法(DSA)的模拟.ECDSA于1999年成为ANSI标准,并于2000年成为IEEE和NIST标准.它在 ...

  4. JAVA加解密 -- 数字签名算法

    数字签名 – 带有密钥的消息摘要算法 作用:验证数据完整性.认证数据来源.抗否认(OSI参考模型) 私钥签名,公钥验证 RSA 包含非对称算法和数字签名算法 实现代码: //1.初始化密钥 KeyPa ...

  5. .NET Core加解密实战系列之——消息摘要与数字签名算法

    目录 简介 功能依赖 消息摘要算法 MD算法 家族发展史 应用场景 代码实现 MD5 示例代码 SHA算法 应用场景 代码实现 SHA1 SHA256 示例代码 MAC算法 HMAC算法的典型应用 H ...

  6. RSA/SHA1加密和数字签名算法在开放平台中的应用

    加密算法 加密算法分为两大类:1.对称加密算法:2.非对称加密算法.   密钥个数 加密 解密 对称加密 一个 使用密钥加密 使用同一个密钥解密 非对称加密 两个,公钥和私钥 使用其中一把密钥加密 使 ...

  7. java数字签名算法之RSA

    © 版权声明:本文为博主原创文章,转载请注明出处 实例 1.项目结构 2.pom.xml <project xmlns="http://maven.apache.org/POM/4.0 ...

  8. RSA 数据加密和数字签名算法

    PKCS8EncodedKeySpec pkcs8KeySpec = KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM); Pr ...

  9. java-信息安全(十)-数字签名算法DSA

    概述 信息安全基本概念: DSA算法(Digital Signature Algorithm,数据签名算法) DSA Digital Signature Algorithm (DSA)是Schnorr ...

随机推荐

  1. LINUX硬件查看命令

    1.查看系统PCI设备 lspci lspci -v   显示更详细的PCI设备信息 2.查看CPU信息 more / proc /cpuinfo 3.查看系统内存信息 more /proc /mem ...

  2. [C/C++] 大小端存储问题

    首先来看一下今天做的一道题: 解析: union 维护足够的空间来置放多个数据成员中的“一种”,而不是为每一个数据成员配置空间,在union 中所有的数据成员共用一个空间,同一时间只能储存其中一个数据 ...

  3. RT-thread内核之空闲线程

    空闲线程是系统线程中一个比较特殊的线程,它具有最低的优先级,当系统中无其他线程可运行时,调度器将调度到空闲线程.空闲线程通常是一个死循环,永远不被挂起.RT-Thread实时操作系统为空闲线程提供了钩 ...

  4. NOIP1998 提高组

    [NOIP2002] 提高组 T2.联接数 算法:贪心+字符串处理 [问题分析]: 按整数对应的字符串大到小连接,因为题目的例子都符合,但是不难找到反例:12   121 应该组成12121而非121 ...

  5. CentOS 文件搜索find

    1.文件搜索,内置的的命令是find 用法: find [查找路径] 寻找条件 操作 默认路径为当前目录:默认表达式为 -print 2.主要参数: -name 匹配名称 -perm 匹配权限(mod ...

  6. 【刷题】洛谷 P3901 数列找不同

    题目描述 现有数列 \(A_1,A_2,\cdots,A_N\) ,Q 个询问 \((L_i,R_i)\) , \(A_{Li} ,A_{Li+1},\cdots,A_{Ri}\) 是否互不相同 输入 ...

  7. POJ3581:Sequence——题解

    http://poj.org/problem?id=3581 给一串数,将其分成三个区间并且颠倒这三个区间,使得新数列字典序最小. 参考:http://blog.csdn.net/libin56842 ...

  8. bzoj1778: [Usaco2010 Hol]Dotp 驱逐猪猡(概率DP+高斯消元)

    深夜肝题...有害身心健康QAQ 设f[i]为到达i的概率,d[i]为i的度数. 因为无限久之后炸弹爆炸的概率是1,所以最后在i点爆炸的概率实际上就是f[i]/sigma(f[]) 列出方程组 f[i ...

  9. Django ORM 查询

    过滤器 过滤器 作用 all() 查出所有行 filter() 可以添加过滤条件 order_by() 查出所有数据,如果有参数则按参数排序,参数是字符串 ,如:"-username&quo ...

  10. memchr函数

    函数原型:extern void *memchr(void *str, char ch, unsigned count) 参数说明:从str所指内存区域的前count个字节查找字符ch.        ...