精华内容
下载资源
问答
  • rsa数字签名算法c语言
    2021-05-25 01:51:46

    public static void jdkRsa(String data) {

    try {

    // 初始化密钥

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

    keyPairGenerator.initialize(512);

    // 获取密钥

    KeyPair keyPair = keyPairGenerator.generateKeyPair();//keypair将公钥和密钥联系起来了,如果不是同一个对象就会验证通不过

    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();

    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

    Signature signature = Signature.getInstance("MD5withRSA");

    signature.initSign(privateKey);

    signature.update(data.getBytes());

    //加密之后的字节数组

    byte[] result = signature.sign();

    StringBuilder hexString = new StringBuilder();

    for (int i = 0; i < result.length; i++) {

    if ((result[i] & 0xff) < 0x10)

    hexString.append("0");

    hexString.append(Integer.toHexString(0xFF & result[i]));

    }

    System.out.println("加密后的数据:" + hexString.toString().toLowerCase());

    //验证是否正确

    //获取公钥keyPair一定要和获取私钥的是同一个对象

    RSAPublicKey rsaPublicKey=(RSAPublicKey)keyPair.getPublic();

    X509EncodedKeySpec x509EncodedKeySpec=new X509EncodedKeySpec(rsaPublicKey.getEncoded());

    //keyFactory=keyFactory.getInstance("RSA");

    PublicKey publicKey=keyFactory.generatePublic(x509EncodedKeySpec);

    //signature=Signature.getInstance("MD5withRSA");

    signature.initVerify(publicKey);

    signature.update(data.getBytes());

    boolean isOk=signature.verify(result);

    System.out.println("验证结果:"+isOk);

    } catch (Exception e) {

    e.printStackTrace();

    }

    }

    更多相关内容
  • 数字签名算法rsa

    千次阅读 2021-05-25 01:51:44
    数字签名算法消息传递模型由消息发送方构建密钥对,这里由甲方完成。由消息发送方公布公钥至消息接收方,这里由甲方将公钥公布给乙方。...RSA数字签名算法是迄今为止应用最为广泛的数字签名算法。 RS...

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

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

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

    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数字签名算法,用java进行编程,能够完整的在eclipse上运行,具体可用于密码学的课程设计等。
  • RSA 数字签名 c

    2010-05-25 22:44:15
    RSA 数字签名 c语言实现~可运行成功
  • 数字签名算法RSA

    千次阅读 2021-05-26 02:42:27
    //使用私钥进行签名 System.out.println("jdk RSA签名" + Hex.encodeHexString(result)); //验证签名 X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded()); keyFactory = ...

    package signature;

    import java.security.InvalidKeyException;

    import java.security.KeyFactory;

    import java.security.KeyPair;

    import java.security.KeyPairGenerator;

    import java.security.NoSuchAlgorithmException;

    import java.security.PrivateKey;

    import java.security.PublicKey;

    import java.security.Signature;

    import java.security.SignatureException;

    import java.security.interfaces.RSAPrivateKey;

    import java.security.interfaces.RSAPublicKey;

    import java.security.spec.InvalidKeySpecException;

    import java.security.spec.PKCS8EncodedKeySpec;

    import java.security.spec.X509EncodedKeySpec;

    import org.apache.commons.codec.binary.Hex;

    public class RSA {

    private static String src = "邓贵坤";

    public static void main(String[] args) {

    RSAj();

    }

    public static void RSAj(){

    try {

    //初始化签名

    KeyPairGenerator keyPairGenerator = KeyPairGenerator.getInstance("RSA");

    keyPairGenerator.initialize(512);

    KeyPair keyPair = keyPairGenerator.generateKeyPair();

    RSAPublicKey rsaPublicKey = (RSAPublicKey) keyPair.getPublic();//公钥

    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey) keyPair.getPrivate();//秘钥

    //执行签名

    PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded());

    KeyFactory keyFactory = KeyFactory.getInstance("RSA");

    PrivateKey privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);

    Signature signature = Signature.getInstance("MD5withRSA");

    signature.initSign(privateKey);

    signature.update(src.getBytes());

    byte[] result = signature.sign();//使用私钥进行签名

    System.out.println("jdk RSA签名" + Hex.encodeHexString(result));

    //验证签名

    X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(rsaPublicKey.getEncoded());

    keyFactory = KeyFactory.getInstance("RSA");

    PublicKey publicKey = keyFactory.generatePublic(x509EncodedKeySpec);

    signature = Signature.getInstance("MD5withRSA");

    signature.initVerify(publicKey);

    signature.update(src.getBytes());

    boolean bool = signature.verify(result);//使用公钥进行验证

    System.out.println("jdk RSA 签名" + bool);

    } catch (NoSuchAlgorithmException e) {

    e.printStackTrace();

    } catch (InvalidKeySpecException e) {

    e.printStackTrace();

    } catch (SignatureException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    } catch (InvalidKeyException e) {

    // TODO Auto-generated catch block

    e.printStackTrace();

    }

    }

    }

    ①发送方构建密钥对

    ②将秘钥公布给伙伴

    ③使用私钥签名

    ④将签名和数据发送给伙伴

    ⑤伙伴使用公钥签名验证数据

    展开全文
  • C++编写的rsa数字签名程序源代码C++编写的rsa数字签名程序源代码C++编写的rsa数字签名程序源代码
  • 数字签名算法,c++实现,RSA的算法

    热门讨论 2010-12-23 10:10:56
    包涵三个RSA算法,c++是实现,数字签名的合集,三个独自的程序,可以独自编译运行,VC6.0下编译
  • RSA算法的C++实现

    千次阅读 2021-05-25 01:28:30
    RSA算法的C++实现[摘要]公钥密码体制出现以前,所有的密码算法基本上都是基于代替和置换。而公钥密码体制则是基于新的理论和技术:它突破了传统的代替与置换,是数学函数;它以非对称的形式提供两个密钥。两个密钥的...

    RSA算法的C++实现

    [摘要]公

    钥密码体制出现以前,所有的密码算法基本上都是基于代替和置换。而公钥密码体制则是基于新的理论和技术:它突破了传统的代替与置换,是数学函数;它以非对

    称的形式提供两个密钥。两个密钥的出现对于保密性、密钥分配、认证等都有划时代的意义。非对称密码体制在加密和解密操作中使用不同的密钥,从而构成不对称

    体制。加密密钥可以公开,解密密钥必须保密。其密钥分发简单,可以通过一般的通信渠道分发,需要保密保存的密钥量大大减少,N个人只需N把密钥(线性增

    长),可满足互不相识的人之间的私人谈话的保密要求,可以完成数字签名。

    [关键词] RSA 加密 模数 明文 密文

    1. 概述

    前最著名、应用最广泛的公钥系统RSA是在1978年,由美国麻省理工学院(MIT)的Rivest、Shamir和Adleman在题为《获得数字签名

    和公开钥密码系统的方法》的论文中提出的。它是一个基于数论的非对称(公开钥)密码体制,是一种分组密码体制。其名称来自于三个发明者的姓名首字母。

    它的安全性是基于大整数素因子分解的困难性,而大整数因子分解问题是数学上的著名难题,至今没有有效的方法予以解决,因此可以确保RSA算法的安全性。

    RSA系统是公钥系统的最具有典型意义的方法,大多数使用公钥密码进行加密和数字签名的产品和标准使用的都是RSA算法。

    RSA算法是第

    一个既能用于数据加密也能用于数字签名的算法,因此它为公用网络上信息的加密和鉴别提供了一种基本的方法。它通常是先生成一对RSA

    密钥,其中之一是保密密钥,由用户保存;另一个为公开密钥,可对外公开,甚至可在网络服务器中注册,人们用公钥加密文件发送给个人,个人就可以用私钥解密

    接受。为提高保密强度,RSA密钥至少为500位长,一般推荐使用1024位。

    该算法基于下面的两个事实,这些事实保证了RSA算法的安全有效性:

    1) 已有确定一个数是不是质数的快速算法;

    2) 尚未找到确定一个合数的质因子的快速算法。

    前,日益激增的电子商务和其它因特网应用需求使公钥体系得以普及,这些需求量主要包括对服务器资源的访问控制和对电子商务交易的保护,以及权利保护、个人

    隐私、无线交易和内容完整性(如保证新闻报道或股票行情的真实性)等方面。公钥技术发展到今天,在市场上明显的发展趋势就是PKI与操作系统的集

    成,PKI是“Public Key

    Infrastructure”的缩写,意为“公钥基础设施”。公钥体制广泛地用于CA认证、数字签名和密钥交换等领域。

    公钥加密算法中

    使用最广的是RSA。RSA算法研制的最初理念与目标是努力使互联网安全可靠,旨在解决DES算法秘密密钥的利用公开信道传输分发的难题。而实际结果不但

    很好地解决了这个难题;还可利用RSA来完成对电文的数字签名以抗对电文的否认与抵赖;同时还可以利用数字签名较容易地发现攻击者对电文的非法篡改,以保

    护数据信息的完整性。目前为止,很多种加密技术采用了RSA算法,该算法也已经在互联网的许多方面得以广泛应用,包括在安全接口层(SSL)标准(该标准

    是网络浏览器建立安全的互联网连接时必须用到的)方面的应用。此外,RSA加密系统还可应用于智能IC卡和网络安全产品。

    2. RSA算法的编程思路

    1) 确定密钥的宽度。

    2) 随机选择两个不同的素数p处q,它们的宽度是密钥宽度的二分之一。

    3) 计算出p和q的乘积n 。

    4) 在2和Φ(n)之间随机选择一个数e , e 必须和Φ(n)互素,整数e用做加密密钥(其中Φ(n)=(p-1)*(q-1))。

    5) 从公式ed ≡ 1 mod Φ(n)中求出解密密钥d 。

    6) 得公钥(e ,n ), 私钥 (d , n) 。

    7) 公开公钥,但不公开私钥。

    8) 将明文P (假设P是一个小于n的整数)加密为密文C,计算方法为:C = Pe mod n    9) 将密文C解密为明文P,计算方法为:

    P = Cd mod n    然而只根据n和e(不是p和q)要计算出d是不可能的。因此,任何人都可对明文进行加密,但只有授权用户(知道d)才可对密文解密

    3. 程序实现

    3.1 密钥产生模块流程图

    uid-20792262-id-439739.html

    key_produce.h //==本程序提供密钥产生的一些基本数学实现

    #include

    class CKEY_PRODUCE

    {

    public:

    CKEY_PRODUCE();

    virtual ~CKEY_PRODUCE();

    public:

    int JudgePrime(unsigned int prime);//==========判prime是否为素数

    //============================================算出p*q的欧拉值

    int Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la);

    //============================================求两个数的最大公因数

    unsigned int CountCommonData(unsigned int a, unsigned int b);

    //=============================================随机选择公钥e

    int RandSelect_e( unsigned int ao_la, unsigned int* e );

    //=============================================求b的e次方除d的余数

    unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);

    //=============================================求任意大于2的整数的欧拉值

    unsigned int CountAnyNumAola(unsigned int number);

    //=============================================产生RSA 公_私 密钥

    int Produce_RSA_Key(unsigned int p,unsigned int q, unsigned int* Ke, unsigned int* Kd, unsigned int* model);

    //===========================利用加的模等于模的加求e*d = 1 mod model 中的d

    int OverOneNum(unsigned int e,unsigned int model, unsigned int* d);

    };

    key_produce.cpp//==本程序提供密钥产生的一些基本数学实现

    CKEY_PRODUCE::CKEY_PRODUCE()

    {}

    CKEY_PRODUCE::~CKEY_PRODUCE()

    {}

    int CKEY_PRODUCE::Produce_RSA_Key(unsigned int p,unsigned int q, unsigned int* Ke, unsigned int* Kd, unsigned int* model)

    {

    unsigned int ao_la;

    if( Count_N_AoLa_Num(p, q, &ao_la) )

    {

    if( RandSelect_e(ao_la, Ke) )

    {

    //*Kd= GetOutNum (*Ke, CountAnyNumAola(ao_la)-1 ,ao_la) ;

    //注:求Kd还是不用 x= a^(n'的欧拉数 - 1) mod n' (其中n'= (p-1)*(q-1) ),因n'的//欧拉数也不好求

    if( OverOneNum(*Ke, ao_la, Kd) )

    {

    *model= p*q;

    return 1;

    }

    }

    }

    return 0;

    }

    int CKEY_PRODUCE::JudgePrime(unsigned int prime)

    {

    unsigned int i;

    unsigned int limit= (unsigned int)sqrt( (double)prime );

    for(i=2; i <= limit; i++)

    {

    if(prime%i==0)

    {

    return 0;

    }

    }

    return 1;

    }

    int CKEY_PRODUCE::Count_N_AoLa_Num(unsigned int p, unsigned int q, unsigned int * ao_la)

    {

    if( !JudgePrime(p) )

    return 0;

    if( !JudgePrime(q) )

    return 0;

    *ao_la = (p-1)*(q-1);

    return 1;

    }

    unsigned int CKEY_PRODUCE::CountCommonData(unsigned int a, unsigned int b)

    {

    unsigned int c ;

    if( c= a%b )

    return CountCommonData(b,c);

    else

    return b;

    }

    int CKEY_PRODUCE::RandSelect_e( unsigned int ao_la, unsigned int* e )

    {

    unsigned int tmp;

    unsigned int div;

    if( ao_la <= 2 )

    {

    return 0;

    }

    srand( time(0) );

    div= ao_la - 2;

    do

    {

    tmp = ( (unsigned int)rand()+90 ) % div + 2;

    }while( CountCommonData(tmp, ao_la)!=1 );

    *e = tmp;

    return 1;

    }

    //==================================求b的e次方除d的余数

    unsigned int CKEY_PRODUCE::GetOutNum(unsigned int b,unsigned int e , unsigned int d)

    {

    unsigned int i;

    unsigned int outNum= 1;

    for( i=0; i//=========用了乘的模 等于 模的乘

    {

    outNum *= b;//==============b d如果长过16位,很有可能溢出

    if( outNum >= d )

    outNum %= d;

    if(!outNum)

    return outNum;

    }

    return outNum%d;

    }

    //==============================利用加的模等于模的加求e*d = 1 mod model 中的d

    int CKEY_PRODUCE::OverOneNum(unsigned int e,unsigned int model, unsigned int* d)

    {

    unsigned int i;

    unsigned int over= e;

    for(i=1; i{

    over= over % model;

    if( over==1 )

    {

    *d = i;

    return 1;

    }

    else

    {

    if(over+e<= model)

    {

    do

    {

    i++;

    over += e;

    }

    while( over+e <= model );

    }

    else

    {

    i++;

    over +=e;

    }

    }

    }

    return 0;

    }

    //==================================求任意大于1的整数的欧拉值

    unsigned int CKEY_PRODUCE::CountAnyNumAola(unsigned int number)

    {

    unsigned int ao_la= 1;

    unsigned int i;  if( number<=1 )

    printf("本函数不处理2以下的范围!\n");

    for(i=2; i{

    if( CountCommonData(number, i)==1 )

    ao_la ++;

    }

    return ao_la;

    }

    3.2 加密模块流程图

    uid-20792262-id-439739.html

    encryption.h//==本程序提供对文件进行加密解密的操作

    class CENCRYPTION

    {

    public:

    CENCRYPTION();

    virtual ~CENCRYPTION();

    void Encrypt(UINT PublicKey, UINT mod, FILE* fipRe, FILE* fipWr,char* extrName );

    void Explain(UINT PrivateKey, UINT mod, FILE* fipRe, FILE* fipWr );

    void TxtEncrypt(unsigned* cipSourceTxt, int buffSize, unsigned int Ke, unsigned int model);

    private:

    //==================================求b的e次方除d的余数

    unsigned int GetOutNum(unsigned int b,unsigned int e , unsigned int d);

    //==================================对原文进行加密并覆盖原缓冲区

    };

    encryption.cpp//==本程序提供对文件进行加密解密的操作

    CENCRYPTION::CENCRYPTION()

    { }

    CENCRYPTION::~CENCRYPTION()

    { }

    //==================================对原文进行加密并覆盖原缓冲区

    void CENCRYPTION::TxtEncrypt(unsigned* cipSourceTxt, int buffSize, unsigned int Ke, unsigned int model)

    {

    int i;

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

    {

    cipSourceTxt[i] = GetOutNum( cipSourceTxt[i], Ke, model );

    }

    }

    //==================================求b的e次方除d的余数

    unsigned int CENCRYPTION::GetOutNum(unsigned int b,unsigned int e , unsigned int d)

    {

    unsigned int i;

    unsigned int outNum= 1;

    for( i=0; i < e; i++)//=========用了乘的模 等于 模的乘

    {

    outNum *= b;

    if( outNum >= d )

    {

    outNum %= d;

    }

    if(!outNum)

    return outNum;

    }

    return outNum%d;

    }

    void CENCRYPTION::Encrypt(UINT PublicKey, UINT mod, FILE* fipRe, FILE* fipWr ,char* extrName)

    {

    unsigned int ReSize;

    unsigned int uBuf[BUFFER_SIZE]= {0,};

    char cBuf[BUFFER_SIZE];

    unsigned int i;

    for(i=0; i<3; i++)//=====我认为扩展名是3个字符

    {

    if(extrName)//=========如果有扩展名, 将扩展名放入uBuf 和数据一样加密

    {

    uBuf[i]= 0;

    *((char*)(&uBuf[i])) = extrName[i];

    }

    else

    uBuf[i]= 0;

    }

    if(extrName)//===============如果有扩展名, 将扩展名加密

    TxtEncrypt(uBuf, 3,PublicKey,mod);

    fwrite( (char*)uBuf,1, 3*sizeof(unsigned int), fipWr);//密文前12个,字节中是源文件的 扩展名信息

    do

    {

    ReSize= fread(cBuf, 1, BUFFER_SIZE,fipRe);

    if(ReSize)

    {

    unsigned int record=1;

    unsigned int WrNum;

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

    {

    uBuf[i]= 0;

    *((char*)(&uBuf[i])) = (cBuf[i]) ;

    }    TxtEncrypt(uBuf, ReSize,PublicKey,mod);    WrNum= fwrite( (char*)uBuf,1, ReSize*sizeof(unsigned int), fipWr);

    printf("第%d次写入%d字节!\n",record++, WrNum);

    }

    }while(ReSize == BUFFER_SIZE);

    }

    void CENCRYPTION::Explain(UINT PrivateKey, UINT mod, FILE* fipRe, FILE* fipWr )

    {

    unsigned int ReSize;

    unsigned int uBuf[BUFFER_SIZE]= {0,};

    char cBuf[BUFFER_SIZE];

    do

    {

    ReSize= fread(uBuf, sizeof(unsigned int), BUFFER_SIZE,fipRe);

    if(ReSize)

    {

    unsigned int i;

    unsigned int record=1;

    unsigned int WrNum;

    TxtEncrypt(uBuf, ReSize,PrivateKey,mod);

    for(i=0; icBuf[i]= (char)(uBuf[i]);

    WrNum= fwrite( cBuf,1, ReSize, fipWr);

    printf("第%d次写入%d字节!\n",record++, WrNum);

    }

    }while(ReSize == BUFFER_SIZE);

    }

    3.3 解加密模块流程图

    uid-20792262-id-439739.html

    4. RSA程序的运行

    uid-20792262-id-439739.html

    4.1 密钥产生

    点击‘密钥产生’按钮,在 公钥、私钥、模数所示的编辑框内将出现随机产生的密钥。

    也可以点击‘导入密钥’按钮来使用以前产生的密钥,用‘导出密钥’按钮保存本次产生的密钥(下图是导入密钥的截图)

    uid-20792262-id-439739.html

    4.2 明文加密

    点击‘加密’铵钮,在弹出的‘加密’对话框中选择 待加密的明文,存加密结果的密文 ,点击‘OK’即可生成密文(其程序截图如下)

    uid-20792262-id-439739.html

    4.3 密文解密

    确定私钥、模数 和 加密时的公钥、模数相对应, 点击‘解密’按钮,在弹出的‘解密’对话框中选择 待解密的密文,存解密结果的明文, 点击‘OK’即可生成明文 (其程序截图如下)

    uid-20792262-id-439739.html

    5. 算法总结

    我写该程序的目的是为了掌握RSA算法的基本原理、体验应用效果,所以算法中还有些地方需要改进,才能使其更具有实用性,例如,由于没有用到“大数运算子模块”,所以随机所选的素数必须归定在一定的范围里,这在实际运用中就会有安全隐患。

    在编定程序过程中,经老师指点,我实现了对任意类型文件的加密,且解密过程能够自动恢复原明文的扩展名,使用户不要为事先约定文件类型而烦恼。

    以上是本人的一些真实感受,如有不是之处,请指正。

    6. 软件下载演示

    7. 参考文献

    [1] Douglas R.Stinson.《密码学原理与实践》.北京:电子工业出版社,2003,2:131-132

    [2] 西蒙.辛格.《密码故事》.海口:海南出版社,2001,1:271-272

    [3] 嬴政天下.加密算法之RSA算法,,2003

    [4] 加密与数字签名.

    展开全文
  • RSA数字签名实现,采用C语言编程,代码部分粗糙,望有大佬指正,THANK YOU!
  • rsa公钥密码和签名C语言代码

    千次阅读 2020-12-02 12:58:44
    但是RSA问题不会比因子分解问题更加困难,也就是说,在没有解决因子分解问题的情况下可能解决RSA问题,因此RSA算法并不是完全基于大整数因子分解的困难性上的。 ** 1.欧拉函数 什么是欧拉函数 欧拉函数是小于x的整数...
  • rsa加密算法c语言代码

    千次阅读 2021-05-24 07:20:10
    如何用C语言实现RSA算法?上学期交的作业,已通过老师在运行时间上的测试 #include #include unsigned long prime1,prime2,ee; unsigned long *kzojld(unsigned long p,unsigned long q) //扩展欧几里得算法CSS布局...
  • rsa签名 C语言实现

    热门讨论 2010-05-28 17:30:22
    通过输入p q e算出公钥和私钥,用私钥签名,用公钥实现验证,也可以在签名之前先用哈希函数计算一下,这里我就没实现。
  • OpenSSL开源工程中,实现RSA签名方法有多种。该方法基于OpenSSL 3.0版本,调用OpenSSL EVP层的EVP_DigestSign*()与EVP_DigestVerify*()实现pss填充方式的RSA消息签名。消息摘要采用sha256计算,pss中的GMF1采用sha...
  • RSA-PSS数字签名算法

    2021-04-20 15:47:09
    RSA-PSS数字签名算法 RSA概率签名方案
  • 加密算法一、简介数字签名用于验证消息发送者的身份,确保其他人无法伪造身份。二、原理数字签名基于非对称加密算法,利用只有拥有者才有私钥的特性(这可以标识身份)进行的。1、数字签名的生成对发送内容先生成有限...
  • 比较典型的数字签名方案有:· RSA签名算法(R. L. Rivest, A. Shamir, and L. M. Adleman, 1978)· ElGamal 签名算法(T. ElGamal, 1985)· Schnorr签名算法(C. P. Schnorr, 1989)· DSS签名算法(NIST, 1991)基于RSA....
  • RSA C语言实现

    2022-05-14 14:41:20
    RSA密钥生成和加解密,前面的C语言实现
  • javascript密钥个数加密解密对称加密一个使用密钥加密使用同一个密钥解密非对称加密两个,公钥和私钥使用其中一把密钥加密使用另一把密钥解密RSA非对称加密算法RSA是目前应用最普遍的非对称加密算法,各类语言都支持...
  • 数字签名算法--1.RSA算法代码

    千次阅读 2015-03-15 19:04:29
    RSAPrivateKey rsaPrivateKey = (RSAPrivateKey)keyPair.getPrivate(); //2.执行签名 PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(rsaPrivateKey.getEncoded()); KeyFactory ...
  • RSA算法详解及C语言实现

    万次阅读 2016-04-17 23:31:34
    RSA算法它是第一个既能用于数据加密也能用于数字签名算法。它易于理解和操作,也很流行。算法的名字以发明者的名字命名:Ron Rivest, Adi Shamir 和Leonard Adleman。但RSA的安全性一直未能得到理论上的证明。它...
  • RSA是目前最有影响力的公钥加密算法,它能够抵抗到目前为止已知的绝大多数密码攻击,已被ISO推荐为公钥数据加密算法RSA算法是一种非对称密码算法,所谓非对称,就是指该算法需要一对密钥,使用其中一个加密,则...
  • [单片机] rsa2048签名算法

    千次阅读 热门讨论 2021-01-30 14:28:56
    RSA2048签名算法 c语言
  • 实验报告内容  编写函数求出1~65535之间的全部素数  取8-bit的两个素数 p,q,并用来生成一对RSA密钥  编写RSA加密/解密程序(可以限制N为16-bit,并利用上述的p,q)  加密 数字+中文+字符 并随后解密
  • 签名(Blind Signature) 是由Chaum,David提出的一种数字签名方式,其中消息的内容在签名之前对签名者是不可见的(盲化)。经过盲签名得到的签名值可以使用原始的非盲消息使用常规数字签名验证的方式进行公开验证。...
  • RSA算法C语言实现

    2013-06-25 21:11:57
    RSA算法是第一个能同时用于加密和数字签名算法,也易于理解和操作。
  • 公开密钥密码体制的产生主要是因为两个方面的原因,一是由于常规密钥密码体制的密钥分配问题,另一种是由于对和数字签名的需求。 传统的加密方法是加密、解密使用同样的密钥,由发送者和接收者分别保存,在加密和...
  • RSA算法C语言中的实现,RSA加密算法C语言中的的实现
  • elgamal数字签名方案

    2021-05-25 02:48:31
    Elgamal算法由T.E1Gamal在1985...与RSA密码体系既可以用于公钥加密又可以用于数字签名等计划。E1gamal数字签名计划是专门为数字签名的意图而规划的。后来有很多变型的Elgamal签名计划被提出。在1989年,Schnorr提出了...
  • RSA算法的原理及实验(用C语言实现)

    千次阅读 多人点赞 2019-10-11 22:15:20
    RSA算法的原理及实验——用C语言实现 RSA算法加解密其实就是两个公式和四个概念,即:互质(素)、欧拉函数、欧拉定理、模反元素(逆元)。这写公式和概念这里不做介绍,详细戳这里:...
  • 对hash值的数字签名和验证 ——C语言实例下面的程序首先计算一串数据的hash值并对hash值进行数字签名,对其数字签名进行验证。签名者使用私钥对hash值进行签名,将自己的公钥发布以便他人验证数字签名。这个实例执行...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,740
精华内容 696
关键字:

rsa数字签名算法c语言