精华内容
下载资源
问答
  • 数字签名算法
    千次阅读
    2021-05-25 01:51:44

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

    由消息发送方构建密钥对,这里由甲方完成。

    由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方。

    f158413644b0e02d0c0f6ddf4d846b26.png

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

    190979ab573d7c345d1d5ba874beed81.png

    RSA

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

    MD系列主要包括:MD2withRSA和MD5withRSA。

    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<

    ';

    cout<

    '<

    ';

    int i = 0;

    for(i = 0; i < 100; i++)

    Ciphertext[i] = Modular_Exonentiation(Plaintext[i], e, n);

    cout<

    ';

    for(i = 0; i < 100; i++)

    cout<

    cout<

    '<

    ';

    }

    //RSA解密

    void RSA_Decrypt()

    {

    int i = 0;

    for(i = 0; i < 100; i++)

    Ciphertext[i] = Modular_Exonentiation(Ciphertext[i], d, n);

    cout<

    ';

    for(i = 0; i < 100; i++)

    cout<

    cout<

    '<

    ';

    }

    //算法初始化

    void Initialize()

    {

    int i;

    srand((unsigned)time(NULL));

    for(i = 0; i < 100; i++)

    Plaintext[i] = rand()%1000;

    cout<

    ';

    for(i = 0; i < 100; i++)

    cout<

    cout<

    '<

    ';

    }

    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

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

    更多相关内容
  • 基于RSA的数字签名算法的实现,能够用在VC6.0 平台运行。RSA加密算法中,消息发送方是用公钥对数据进行加密,消息接收方用私钥对密文进行解密获得消息;在RSA签名算法中,消息发布者用私钥对消息进行签名,消息接收...
  • 为此,在环签名理论、 Elgamal数字签名算法与PBFT算法的基础上,提出一种基于 Elgamal数字签名算法的环签名改进方案。对环签名算法进行正确性及匿名性分析,运用环签名方案改进PBFT算法的签名及验证过程,使用 ...
  • 实现数字签名算法以及验证数字签名算法的正确性。本程序经本人验证
  • 主要介绍了Java实现的数字签名算法RSA,结合完整实例形式详细分析了RSA算法的相关概念、原理、实现方法及操作技巧,需要的朋友可以参考下
  • 数字签名算法

    2013-04-19 13:44:55
    纤细介绍了信息安全中的主要数字签名算法。RSA,DSS,ElGamal,Schnorr,Ecdsa等算法。
  • 数字签名算法(DSA)使用每个消息的短暂秘密来计算模幂。 这涉及一系列模平方和乘法运算,如果已知,则会泄漏每条消息的临时密钥的几位信息,这些信息可用于基于格的攻击中以获得DSA私钥。 这项工作调查了DSA的基于...
  • RSA的实现,可以根据文章来实现RSA算法
  • #资源达人分享计划#
  • sm2数字签名算法python实现
  • 关键词:数字签名算法;现场可编程门阵列(FPGA);计算机安全 引言 随着网络的迅速发展,对安全性的需要越发重要。然而,尽管网络技术进步很快,安全性问题仍然相对落后,并且在很多情况下只能靠虚拟私人网VPN和...
  • 椭圆曲线数字签名算法(ECDSA)

    千次阅读 2022-02-01 22:40:42
    一. 椭圆曲线加密算法 简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和...

    一. 椭圆曲线加密算法
    简称ECC,是基于椭圆曲线数学理论实现的一种非对称加密算法。相比RSA,ECC优势是可以使用更短的密钥,来实现与RSA相当或更高的安全,RSA加密算法也是一种非对称加密算法,在公开密钥加密和电子商业中RSA被广泛使用。据研究,160位ECC加密安全性相当于1024位RSA加密,210位ECC加密安全性相当于2048位RSA加密(有待考证)
    二. 什么是椭圆曲线
    Wolfram MathWorld给出了个准确非凡的定义椭圆曲线。椭圆曲线可以暂时简单的理解为描述了特定点的集合的公式:
    在这里插入图片描述
    以下是a和b参数的变化对应的图形的示例:
    在这里插入图片描述
    b=1,a取值范围从2到-3
    在这里插入图片描述
    特殊曲线:左边参数是a=b=0,右边参数是a=-3,b=2.这两条都不是符合标准的曲线。
    a和b的取值变化决定了曲线在坐标系上的不同形状。从图中可以看到,椭圆曲线是相对X轴对称。
    另外定义一个无穷大的点(也可以成为理想点),以符号0,也就是零表示该点。
    三. 阿贝尔群
    椭圆曲线也可以有运算,像实数的加减乘除一样,这就需要使用到加群。19世纪挪威的尼尔斯·阿贝尔抽象出了加群(又叫阿贝尔群或交换群)。数学中的群是一个集合,我们为它定义了一个“加法”,并用符号+表示。假定群用 表示,则加法必须遵循以下四个特性:

    封闭性:如果a和b都是 的成员,那么a+b也是 的成员;
    结合律:(a + b) + c = a + (b + c);
    单位元:a+0=0+a=a,0就是单位元;
    逆元:对于任意值a必定存在b,使得a+b=0。

    如果再增加一个条件,交换律:a + b = b + a,则称这个群为阿贝尔群,根据这个定义整数集是个阿贝尔群。

    四. 椭圆的几何加法
    因为椭圆曲线是阿贝尔群,所以公式P+Q+R=0 以及 P+Q=−R成立。在椭圆曲线上画出点P和点Q,连直线穿过P和Q,该直线会与椭圆曲线相较于第三个点,称之为R。根据R取得R的逆元-R,P+Q=-R。
    在这里插入图片描述
    运用几何学的方法很容易得到我们要的结果,但是我们需要再对一些更精确的解释。特别是有一些问题需要考虑:
    • 如果P=0或者Q=0(0是无穷远点)呢?无法画出该直线,因为无穷远点无法体现在直角坐标系里。但是既然已经定义了无穷远点0,那么对于任意给定的P或者Q,P+0=P以及0+Q=Q都是成立的。
    • 如果P=-Q呢?这种情况下该直线是与X轴是垂直的,并且不会与椭圆曲线相交于第三个点。 根据公理,P就是Q的逆元,P+Q=P+(-P)=0。
    • 如果P=Q呢?这种情况下,存在无数条线穿过这个点。这里要用到极限的思维。假设线上有另外一个点Q1,让Q1不断靠近P, 随着Q1不断靠近P,最终Q1无限靠近P,产生了一条直线与椭圆曲线相切。那么可以得到 P+P=-R, 在这里R就是该直线与椭圆曲线的另外一个交点。
    在这里插入图片描述
    • 如果P≠Q,但是不存在第三个交点R呢?这种情况和上一个情况很类似。实际上,这种情况下该直线跟椭圆曲线是相切的关系。
    在这里插入图片描述
    假设P就是相切的点。在上一个情况里,有该等式P+P=-Q。而在这里变成了P+Q=-P。另一方面,如果Q是相切的点,那么P+Q=-Q。
    五. 代数上的加法
    要计算点的加法的话,我们必须把前面的几何学的讨论转到代数上的讨论,考虑非0,非对称的点P(x1,y1)和Q(x2,y2),R(x3,y3)为过P,Q与曲线相交点,则:
    x3=k^2−x1−x2
    y3=k(x1−x3)−y1
    若P=Q,则k=(3x1^2+a)/2y1
    若P≠Q,则k= (y2−y1)/ (x2−x1)

    六. 标量乘法
    同点加法,若有k个相同的点P相加,记作kP 。 P+P=2P
    在这里插入图片描述
    P+P+P=2P+P=3P
    在这里插入图片描述
    七. 有限域椭圆曲线
    椭圆曲线是连续的,并不适合用于加密;所以,我们必须把椭圆曲线变成离散的点,我们要把椭圆曲线定义在有限域上。
    我们给出一个有限域Fp
    1.Fp中有p(p为质数)个元素0,1,2,…, p-2,p-1
    2.Fp的加法是a + b ≡ c ( m o d p )
    3.Fp的乘法是a × b ≡ c ( m o d p )
    4.Fp的除法是a ÷ b ≡ c ( m o d p ) , 即 a × b ^− 1 ≡ c ( m o d p ) , b^ − 1 也 是 一 个 0 到 p − 1 之 间 的 整 数 , 但 满 足 b × b ^− 1 ≡ 1 ( m o d p )
    5.Fp的单位元是1,零元是 0
    6.Fp域内运算满足交换律、结合律、分配律
    7.椭圆曲线Ep(a,b),p为质数,x,y∈[0,p-1]
    在这里插入图片描述
    选择两个满足下列约束条件的小于p的非负整数a、b :
    在这里插入图片描述
    有限域椭圆曲线点的阶, 如果椭圆曲线上一点P,存在最小的正整数n使得数乘n P = O∞,则将n称为P的阶,若n不存在,则P是无限阶的.

    八. 椭圆曲线加密
    考虑K=kG,其中K、G为椭圆曲线Ep(a,b)上的点,n为G的阶(n G = O∞ ),k为小于n的整数。则给定k和G,根据加法法则,计算K很容易但反过来,给定K和G,求k就非常困难。因为实际使用中的ECC原则上把p取得相当大,n也相当大,要把n个解点逐一算出来列成上表是不可能的。这就是椭圆曲线加密算法的数学依据 。

    1.点G称为基点(base point)
    2.k(k<n)为私有密钥(private key)
    3.K为公开密钥(public key)

    下面是利用椭圆曲线进行加密通信的过程(公钥加密私钥解密过程):
    1、用户A选定一条椭圆曲线Ep(a,b),并取椭圆曲线上一点,作为基点G。
    2、用户A选择一个私有密钥k,并生成公开密钥K=kG。
    3、用户A将Ep(a,b)和点K,G传给用户B。
    4、用户B接到信息后 ,将待传输的明文编码到Ep(a,b)上一点M(编码方法很多,这里不作讨论),并产生一个随机整数r(r<n)。
    5、用户B计算点C 1 = M + r K和C 2 = r G。
    6、用户B将C 1 、 C 2 传给用户A。
    7、用户A接到信息后,计算C 1 − k C 2 ,结果就是点M。再对点M进行解码就可以得到明文。
    因为C 1 − k C 2 = M + r K − k ( r G ) = M + r k G − k r G = M

    九. 数字签名
    数字签名是公钥密码学发展过程中最重要的概念之一,产生和使用数字签名过程的一般模型如图所示
    在这里插入图片描述
    十. 椭圆曲线数字签名算法(ECDSA)
    ECDSA处理过程:
    1.参与数字签名的所有通信方都使用相同的全局参数,用于定义椭圆曲线以及曲线上的基点
    2.签名者首先生成一对公私钥。对于私钥,选择一个随机数或者伪随机数作为私钥,利用随机数和基点算出另一点,作为公钥
    3.对消息计算Hash值,用私钥、全局参数和Hash值生成签名
    4.验证者用签名者的公钥、全局参数等验证。
    全局参数:
    在这里插入图片描述
    密钥生成:
    每个签名者都要生成一对公私钥,假设是Bob
    在这里插入图片描述
    这里是定义在在这里插入图片描述
    上的椭圆曲线,椭圆曲线上的乘法运算就是多个点的累加运算,最后的结果还是椭圆曲线上的点,有了公钥之后,Bob对消息m生成320字节的数字签名:
    在这里插入图片描述
    第2步确保最后算出的公钥(椭圆曲线上的点)是落在曲线上。第5步,如果为O点也是不符合的,所以也要重新生成。
    Alice在获得Bob的公钥和全局参数后,即可校验签名
    在这里插入图片描述
    在这里插入图片描述
    该过程有效性证明如下,如果Alice收到的消息确实是Bob签署的,那么
    s = (e+dr)k^-1 mod n
    于是 k= (e+dr)s^-1 mod n
    = (e s^-1 + dr s^-1) mod n
    = (we +wdr) mod n
    =(u1 + u2d) mod n
    现在考虑u1G + u2Q = u1G + u2dG = (u1 + u2d)G = KG
    在验证过程的步骤6中,有v = x1 mod n , 这里解点 X =(x1,y1) = u1G + u2Q。因为
    R = x mod n 且x 是解点kG的x 坐标,又因为 我们已知 u1G + u2Q = KG,所以可得到 v = r。

    展开全文
  • SM2椭圆曲线公钥密码算法-part2-数字签名算法;国密算法 标准文件
  • 包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译 包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译
  • dsa数字签名算法.doc

    2020-08-01 00:13:52
    DSA数字签名算法 1 引言 为了确保数据传输的安全性不得不采取一系列的安全技术如加密技术数字签名身份认证密钥管理防火墙安全协议等其中数字签名就是实现网上交易安全的核心技术之一它可以保证信息传输的保密性数据...
  • dsa数字签名算法Digital Signature Algorithm (DSA) is one of the Federal Information Processing Standard for making digital signatures depends on the mathematical concept or we can say the formulas of ...

    dsa数字签名算法

    Digital Signature Algorithm (DSA) is one of the Federal Information Processing Standard for making digital signatures depends on the mathematical concept or we can say the formulas of modular exponentiation and the discrete logarithm problem to cryptograph the signature digitally in this algorithm.

    数字签名算法(DSA)是使数字签名依赖于数学概念的联邦信息处理标准之一,或者我们可以说模幂运算的公式和离散对数问题,用于在该算法中对数字进行数字加密。

    It is Digital signatures are the public-key primitives of message authentication in cryptography. In fact, in the physical world, it is common to use handwritten signatures on handwritten or typed messages at this time. Mainly, they are used to bind signatory to the message to secure the message.

    数字签名是加密中消息身份验证的公钥原语。 实际上,在物理世界中,此时通常在手写或键入的消息上使用手写签名。 主要是,它们用于将签名者绑定到消息以保护消息。

    Therefore, a digital signature is a technique that binds a person or entity to the digital data of the signature. Now, this will binding can be independently verified by the receiver as well as any third party to access that data.

    因此,数字签名是一种将人或实体绑定到签名的数字数据的技术。 现在,此绑定将可以由接收者以及访问该数据的任何第三方独立验证。

    Here, Digital signature is a cryptographic value that is calculated from the data and a secret key known only by the signer or the person whose signature is that.

    在此, 数字签名是根据数据和仅由签名者或签名者知道的秘密密钥计算出的密码值。

    In fact, in the real world, the receiver of message needs assurance that the message belongs to the sender and he should not be able to hack the origination of that message for misuse or anything. Their requirement is very crucial in business applications or any other things since the likelihood of a dispute over exchanged data is very high to secure that data.

    实际上,在现实世界中,消息的接收者需要确保该消息属于发送者,并且他不应因滥用或其他任何原因而破解该消息的来源。 他们的要求在业务应用程序或其他任何事情中都至关重要,因为对交换数据进行争执的可能性很高,以确保数据的安全。

    数字签名框图 (Block Diagram of Digital Signature)

    The digital signature scheme depends on public-key cryptography in this algorithm.

    在此算法中,数字签名方案取决于公钥加密。

    DSA (1)

    框图说明 (Explanation of the block diagram)

    • Firstly, each person adopting this scheme has a public-private key pair in cryptography.

      首先,采用此方案的每个人在密码学上都有一个公私钥对。

    • The key pairs used for encryption or decryption and signing or verifying are different for every signature. Here, the private key used for signing is referred to as the signature key and the public key as the verification key in this algorithm.

      每个签名用于加密或解密以及签名或验证的密钥对都不相同。 在此算法中,用于签名的私钥称为签名密钥,公钥称为验证密钥。

    • Then, people take the signer feeds data to the hash function and generates a hash of data of that message.

      然后,人们将签名者的提要数据输入哈希函数,并生成该消息的数据哈希。

    • Now, the Hash value and signature key are then fed to the signature algorithm which produces the digital signature on a given hash of that message. This signature is appended to the data and then both are sent to the verifier to secure that message.

      现在,哈希值和签名密钥随后被馈送到签名算法,该算法在该消息的给定哈希值上生成数字签名。 该签名被附加到数据中,然后两者都发送到验证者以保护该消息。

    • Then, the verifier feeds the digital signature and the verification key into the verification algorithm in this DSA. Thus, the verification algorithm gives some value as output as a ciphertext.

      然后,验证者将数字签名和验证密钥输入此DSA中的验证算法。 因此,验证算法将一些值作为密文输出。

    • Thus, the verifier also runs the same hash function on received data to generate hash value in this algorithm.

      因此,验证程序还在此算法上对接收到的数据运行相同的哈希函数,以生成哈希值。

    • Now, for verification, the signature, this hash value, and output of verification algorithm are compared with each variable. Based on the comparison result, the verifier decides whether the digital signature is valid for this or invalid.

      现在,为了进行验证,将签名,此哈希值以及验证算法的输出与每个变量进行比较。 根据比较结果,验证者确定数字签名对此有效还是无效。

    • Therefore, the digital signature is generated by the 'private' key of the signer and no one else can have this key to secure the data, the signer cannot repudiate signing the data in the future to secure that data by the cryptography.

      因此,数字签名是由签名者的“私钥”生成的,没有其他人可以拥有此密钥来保护数据,签名者以后将无法否认对数据的签名以通过密码保护该数据。

    数字签名的重要性 (Importance of Digital Signature)

    Therefore, all cryptographic analysis of the digital signature using public-key cryptography is considered a very important or main and useful tool to achieve information security in cryptography in cryptoanalysis.

    因此,使用公钥密码术对数字签名进行的所有密码分析被认为是在密码分析中实现密码学信息安全性的非常重要或主要和有用的工具。

    Thus, apart from the ability to provide non-repudiation of the message, the digital signature also provides message authentication and data integrity in cryptography.

    因此,除了提供消息不可否认性的能力之外,数字签名还提供了加密中的消息认证和数据完整性。

    This is achieved by the digital signature are,

    这是通过数字签名实现的,

    • Message authentication: Therefore, when the verifier validates the digital signature using the public key of a sender, he is assured that signature has been created only by a sender who possesses the corresponding secret private key and no one else does by this algorithm.

      消息身份验证 :因此,当验证者使用发送方的公钥验证数字签名时,可以确保签名仅由拥有相应私钥的发送方创建,而该算法没有其他人创建。

    • Data Integrity: In fact, in this case, an attacker has access to the data and modifies it, the digital signature verification at the receiver end fails in this algorithm, Thus, the hash of modified data and the output provided by the verification algorithm will not match the signature by this algorithm. Now, the receiver can safely deny the message assuming that data integrity has been breached for this algorithm.

      数据完整性 :实际上,在这种情况下,攻击者可以访问数据并对其进行修改,该算法在接收方端的数字签名验证失败,因此,修改后的数据的哈希值和验证算法提供的输出将与该算法的签名不匹配。 现在,假设此算法已破坏数据完整性,则接收方可以安全地拒绝该消息。

    • Non-repudiation: Hence, it is just a number that only the signer knows the signature key, he can only create a unique signature on a given data of that message to change in cryptography. Thus, the receiver can present data and the digital signature to a third party as evidence if any dispute arises in the future to secure the data.

      不可否认性 :因此,只有签名者才知道签名密钥的数字,他只能在该消息的给定数据上创建唯一签名以更改密码。 因此,如果将来发生任何争议以保护数据,则接收方可以将数据和数字签名提供给第三方作为证据。

    带有数字签名的加密 (Encryption with Digital Signature)

    It is desirable to exchange encrypted messages than plaintext to achieve confidentiality in cryptography. In fact, in the public key encryption scheme, this is a public or encryption key of the sender is available in the open domain, and hence anyone can spoof his identity and send an encrypted message to the receiver in this algorithm.

    期望交换加密消息而不是明文以实现加密的机密性。 实际上,在公共密钥加密方案中,这是发件人的公共或加密密钥在开放域中可用,因此任何人都可以通过此算法欺骗其身份并将加密的消息发送给接收者。

    DSA (2)

    DSA算法步骤 (DSA Algorithm Steps)

    The first part of the DSA algorithm is the public key and private key generation through some steps, which can be told as:

    DSA算法的第一部分是通过一些步骤生成公钥和私钥,可以将其描述为:

    • Firstly, choose a prime number q, which is called the prime divisor in this.

      首先,选择质数q,在此称为质数除数。

    • Then, choose another primer number p, such that p-1 mod q = 0. p is called the prime modulus in this.

      然后,选择另一个引物编号p,以使p-1 mod q =0。在此将p称为质数模数。

    • Then, choose an integer g, such that 1 < g < p, g**q mod p = 1 and g = h**((p–1)/q) mod p. q is also called g's multiplicative order modulo p in this algorithm.

      然后,选择一个整数g,使得1 <g <p,g ** q mod p = 1且g = h **((p-1)/ q)mod p。 q在此算法中也称为g的乘数模p。

    • Then, choose an integer, such that 0 < x < q for this.

      然后,选择一个整数,例如0 <x <q。

    • Now, compute y as g**x mod p.

      现在,将y计算为g ** x mod p。

    • Thus, Package the public key as {p,q,g,y} is this.

      因此,将公钥打包为{p,q,g,y}就是这个。

    • And, Package the private key as {p,q,g,x} is this.

      并且,将私钥打包为{p,q,g,x}就是这个。

    Then, the second part of the DSA algorithm is the signature generation and signature verification in this algorithm, which can be told as:

    然后,DSA算法的第二部分是该算法中的签名生成和签名验证,可以这样说:

    Firstly, to generate a message signature, the sender can follow these further steps:

    首先,要生成消息签名,发送者可以按照以下进一步步骤操作:

    • Firstly, generate the message digest h, using a hash algorithm like SHA1.

      首先,使用类似于SHA1的哈希算法生成消息摘要h。

    • Then, generate a random number k, such that 0 < k < q.

      然后,生成一个随机数k,使得0 <k <q。

    • Then, Computer as (g**k mod p) mod q. If r = 0, select a different k.

      然后,将计算机作为(g ** k mod p)mod q。 如果r = 0,则选择另一个k。

    • And, Compute i, such that k*i mod q = 1. i is called the modular multiplicative inverse of k modulo q in this.

      并且,计算i,使得k * i mod q =1。在此,i被称为k模q的模乘逆。

    • Then, Compute s = i*(h+r*x) mod q. If s = 0, select a different k.

      然后,计算s = i *(h + r * x)mod q。 如果s = 0,则选择另一个k。

    • Thus, Package the digital signature as {r,s}.

      因此,将数字签名打包为{r,s}。

    Then, to verify a message signature, the receiver of the message and the digital signature can follow these further steps as:

    然后,为了验证消息签名,消息的接收者和数字签名可以按照以下其他步骤操作:

    • Firstly, Generate the message digest h, using the same hash algorithm.

      首先,使用相同的哈希算法生成消息摘要h。

    • Then, Compute w, such that s*w mod q = 1. w is called the modular multiplicative inverse of s modulo q in this.

      然后,计算w,使得s * w mod q =1。w在此称为s模q的模乘逆。

    • Then, Compute u1 = h*w mod q.

      然后,计算u1 = h * w mod q。

    • And, Compute u2 = r*w mod q.

      并且,计算u2 = r * w mod q。

    • Then, Compute v = (((g**u1)*(y**u2)) mod p) mod q.

      然后,计算v =((((g ** u1)*(y ** u2))mod p)mod q。

    • Wherever, If v == r, the digital signature is valid.

      无论何时,如果v == r,则数字签名均有效。

    Image Reference: https://www.tutorialspoint.com/cryptography/cryptography_digital_signatures.htm

    图片参考: https : //www.tutorialspoint.com/cryptography/cryptography_digital_signatures.htm

    翻译自: https://www.includehelp.com/cryptography/digital-signature-algorithm-dsa.aspx

    dsa数字签名算法

    展开全文
  • 包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译 包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译
  • 包含Base64 包含对称加密算法:DES,3DEA,AES,PBE 包含对称加密算法:DH,RAS,ElGamal 包含摘要算法:MD2,MD4...数字签名算法:RSA,DSA,ECDSA 详情请查看:http://blog.csdn.net/baidu_34012226/article/details/53331147
  • 主要介绍了Java数字签名算法DSA,结合实例形式分析了Java数字签名算法DSA具体定义与使用技巧,需要的朋友可以参考下
  • java实现数字签名算法

    千次阅读 2021-02-06 11:39:34
    文章目录前言一、数字签名简述二、数字签名算法家谱三、代码实现1.引入jar包2.RSA数字签名实现总结 前言 数字签名是手写签名在计算机软件应用中的一种体现,同样起到了抗否认的作用。本文介绍什么是数字签名,以及...


    前言

    数字签名是手写签名在计算机软件应用中的一种体现,同样起到了抗否认的作用。本文介绍什么是数字签名,以及如何用java代码实现数字签名。


    一、数字签名简述

    数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说,数字签名算法是非对称加密算法消息摘要算法的结合体。
    签名操作只能由甲方完成,验证签名操作则由乙方来完成,用于验证操作的相关信息是由甲方公布给乙方。
    与摘要值的表示方法相同,签名值也常以十六机制字符串的形式出现。
    在这里插入图片描述

    二、数字签名算法家谱

    在这里插入图片描述

    三、代码实现

    1.引入jar包

    <dependency>
         <groupId>org.bouncycastle</groupId>
         <artifactId>bcprov-jdk15on</artifactId>
         <version>1.67</version>
    </dependency>
    

    2.RSA数字签名实现

    实现细节

    算法密钥长度密钥长度默认值签名长度备注
    MD2withRSA512~65536
    (64的倍数)
    1024与密钥长度相同jdk实现
    MD5withRSA
    SHA1withRSA
    SHA224withRSA2048Bouncy Castle实现
    SHA256withRSA
    SHA384withRSA
    SHA512withRSA
    RIPEMD128withRSA
    RIPEMD160withRSA

    代码

    public class SignatureUtils {
        public static final String KEY_ALGORITHM = "RSA";
    
        // 数字签名算法
        public static final String SIGNATURE_ALGORITHM = "SHA1withRSA";
    
        private static final String PUBLIC_KEY = "RSAPublicKey";
    
        private static final String PRIVATE_KEY = "RSAPrivateKey";
    
        /**
         * RSA密钥长度默认为1024
         * 密钥长度必须是64的倍数
         * 方位在512~65536之间
         */
        private static final int KEY_SIZE = 512;
        
        
        /**
         * 签名
         *
         * @param data       待签名数据
         * @param privateKey 私钥
         * @return 数字签名
         * @throws Exception Exception
         */
        public static byte[] sign(byte[] data, byte[] privateKey) throws Exception {
            // 转换密钥材料
            PKCS8EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(privateKey);
            KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORITHM);
            PrivateKey priKey = keyFactory.generatePrivate(keySpec);
            // 实例化
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initSign(priKey);
            signature.update(data);
            return signature.sign();
        }
    
        /**
         * 校验
         *
         * @param data      待校验数据
         * @param publicKey 公钥
         * @param sign      数字签名
         * @return 校验成功返回true, 失败返回false
         * @throws Exception Exception
         */
        public static boolean verify(byte[] data, byte[] publicKey, byte[] sign) throws Exception {
            X509EncodedKeySpec keySpec = new X509EncodedKeySpec(publicKey);
            KeyFactory factory = KeyFactory.getInstance(KEY_ALGORITHM);
            PublicKey pubKey = factory.generatePublic(keySpec);
            Signature signature = Signature.getInstance(SIGNATURE_ALGORITHM);
            signature.initVerify(pubKey);
            signature.update(data);
            return signature.verify(sign);
        }
    
        /**
         * 获取私钥
         *
         * @param keyMap keyMap
         * @return 私钥
         */
        public static byte[] getPrivateKey(Map<String, Object> keyMap) {
            return ((Key) keyMap.get(PRIVATE_KEY)).getEncoded();
        }
    
        /**
         * 获取公钥
         *
         * @param keyMap keyMap
         * @return 公钥
         */
        public static byte[] getPublicKey(Map<String, Object> keyMap) {
            return ((Key) keyMap.get(PUBLIC_KEY)).getEncoded();
        }
    
        /**
         * 初始化密钥
         *
         * @return map
         * @throws Exception Exception
         */
        public static Map<String, Object> initKey() throws Exception {
            // 实例化密钥对生成器
            KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
            // 初始化密钥对生成器
            keyPairGen.initialize(KEY_SIZE);
            // 生成密钥对
            KeyPair keyPair = keyPairGen.generateKeyPair();
            // 公钥
            RSAPublicKey pubKey = (RSAPublicKey) keyPair.getPublic();
            // 私钥
            RSAPrivateKey priKey = (RSAPrivateKey) keyPair.getPrivate();
            Map<String, Object> keyMap = new HashMap<>();
            keyMap.put(PUBLIC_KEY, pubKey);
            keyMap.put(PRIVATE_KEY, priKey);
            return keyMap;
        }
    
        /**
         * 私钥签名
         *
         * @param data       待签名数据
         * @param privateKey 私钥
         * @return 十六进制签名字符串
         * @throws Exception Exception
         */
        public static String sign(byte[] data, String privateKey) throws Exception {
            return Hex.encodeHexString(sign(data, getKey(privateKey)));
        }
    
        /**
         * 验证签名
         *
         * @param data      待验证数据
         * @param publicKey 公钥
         * @param sign      签名数据
         * @return true or false
         * @throws Exception Exception
         */
        public static boolean verify(byte[] data, String publicKey, String sign) throws Exception {
            return verify(data, getKey(publicKey), Hex.decodeHex(sign.toCharArray()));
        }
    
        
        /**
         * 获取私钥
         *
         * @param keyMap keyMap
         * @return 十六进制私钥
         */
        public static String getPrivateKeyStr(Map<String, Object> keyMap) {
            return Hex.encodeHexString(getPrivateKey(keyMap));
        }
    
        /**
         * 获取公钥
         *
         * @param keyMap keyMap
         * @return 十六进制公钥
         */
        public static String getPublicKeyStr(Map<String, Object> keyMap) {
            return Hex.encodeHexString(getPublicKey(keyMap));
        }
    
        /**
         * 获取密钥
         *
         * @param key 密钥
         * @return 密钥
         */
        public static byte[] getKey(String key) throws DecoderException {
            return Hex.decodeHex(key.toCharArray());
        }
        
    }
    
    

    总结

    数字签名算法是公钥基础设施(Public Key Infrastructure,PKI)以及许多网络安全机制(SSL/TLS)的基础,遵从“私钥签名,公钥验签”的签名/验证方式。我们可以把数字签名算法近似看成是一种附加了公钥和私钥的消息摘要算法。

    展开全文
  • 椭圆曲线数字签名算法(ECDSA)是使用椭圆曲线对数字签名算法(DSA)的模拟,与普通的离散对数问题(discrete logarithm problem DLP)和大数分解问题(integer factorization problem IFP)不同,椭圆曲线离散对数...
  • ;消息认证码算法MAC(Message Authentication Code是含有密钥散列函数算法兼容了MD和SHA算法的特性并在此基础上加上了密钥;谢谢
  • rsa 加密算法 能同时用于加密和数字签名
  • 数字签名算法之RSA

    千次阅读 2020-10-21 14:33:38
    数字签名算法之RSA1.数字签名简述2. 模型分析3. 代码实现3.1 签名算法实现3.2 测试代码3.3 运行结果 1.数字签名简述 数字签名算法可以看做是一种带有密钥的消息摘要算法,并且这种密钥包含了公钥和私钥。也就是说...
  • DSA数字签名算法.doc

    2022-05-08 16:19:29
    DSA数字签名算法.doc

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 82,398
精华内容 32,959
关键字:

数字签名算法