非对称加密到底有哪些用途(RAS实现)

非对称加密到底有哪些用途?

第一个用途当然是做数据加密。

    请大家想象一下,如果我不想让除了接收方以外的其他人,知道我发送的数据的内容的话,需要用哪种密钥对数据进行加密?如果我使用私钥加密,那么根据非对称加密的原理,接收方需要使用公钥来解密,而公钥我已经公开给接收方了,这个方案似乎是可行的,可是这样做问题就出现在公钥上了。在非对称加密中,公钥的公开不仅仅指对接收方的公开,而是指这个密钥彻底的公开,任何人需要都可以得到,这样的话你发送的数据就没有任何秘密可言了。反过来,如果我使用公钥对数据加密,那么对于接收方来说就需要使用私钥进行数据解密,由于私钥只保存在接收方手中,这样其他人就不会得到数据的内容了。这样看来,在非对称加密中,如果需要保护你的数据不被第三者得到,密钥需要由接收方产生,然后接收方将公钥公开出去,发送方使用这个公开的公钥对数据进行加密后传输给接收方,接收方使用自己的私钥进行解密,从而保证了数据的安全性。所以非对称加密又称为公钥加密。

    非对称加密的执行效率要远低于对称加密,所以我们不会对一个大的文件或数据使用非对称加密算法。那么我们如何加密一个大的文件呢?通常情况我们可以选择对称加密算法加密文件,然后使用非对称算法加密对称算法的密钥,这样就保证了对称算法密钥传递的安全性。

非对称加密的另外一个用途就是用来进行数字签名。

    什么是数字签名?数字签名同我们在合同上的签字一样,接收方可以用它来证明收到的数据或文件是由你发送的。举个例子:假设发送方需要将一串数据D发送给接收方,那么接收方如何判断数据D是发送方发送的呢?

Step 1:发送方先产生成一对密钥,并将公钥公开给接收方;

Step 2:发送方将数据D用私钥进行加密得到密文M,然后将数据D和密文M一起发送给接收方;

Step 3:接收方得到数据D和密文M后,用公钥将密文M解密得到d;

Step 4:比较D和d,相等则证明D是由发送方发送的。

    在实际的操作中,我们并不会直接用私钥去加密要发送的数据或文件,这是因为非对称加密的算法非常耗时并且密文的长度要大于明文的长度,直接加密系统的开销非常大。那么如何实解决这个问题呢?

    首先,我们需要了解另外一个概念:消息摘要。所谓的消息摘要就是通过一种单向算法计算出来的唯一对应一个文件或数据的固定长度的值,也被称作数字摘要。根据不同的算法,消息摘要的长度一般为128位或160位。常用的消息摘要的算法有MD5和SHA1。一个文件的消息摘要就同一个人的指纹一样,它可以唯一代表这个文件,如果这个文件被修改了,那么它的消息摘要也一定会发生变化,所以,我们可以通过对一个文件的消息摘要进行签名来代替对它本身进行签名。并且,我们还可以通过验证消息摘要,来确定发送的数据是否完整或曾经被修改过。这样,上面的例子大致可以变为下面这样:

Step 1:发送方先产生成一对密钥,并将公钥公开给接收方;

Step 2:发送方将数据D进行消息摘要,得到Q;

Step 3:用私钥对Q进行加密得到密文MQ,然后将数据D和密文MQ一起发送给接收方;

Step 4:接收方得到数据D和密文MQ后,用公钥将密文MQ解密得到q1;

Step 5:接收方使用相同的算法对数据D进行消息摘要,得到q2;

Step 6:比较q1和q2,相等则证明D是由发送方发送的,且没有被修改过。

    好了,非对称加密的使用介绍了一大堆,后面我们来看看如何用C#来实现RSA非对称加密。

    .Net中的加密操作所涉及的对象都在命名空间System.Security.Cryptography下,所以请先在你的程序中添加using System.Security.Cryptography; 其中,RSA加密算法由RSACryptoServiceProvider对象实现。下面的代码分别实现了数据的加密解密和签名与验证。

string PublicKey, PrivateKey;
   RSACryptoServiceProvider rsaProvider;
   void Initial()
   { 
       //声明一个RSA算法的实例,由RSACryptoServiceProvider类型的构造函数指定了密钥长度为1024位
       //实例化RSACryptoServiceProvider后,RSACryptoServiceProvider会自动生成密钥信息。
       rsaProvider = new RSACryptoServiceProvider(1024);
       //将RSA算法的公钥导出到字符串PublicKey中,参数为false表示不导出私钥
       PublicKey = rsaProvider.ToXmlString(false);
       //将RSA算法的私钥导出到字符串PrivateKey中,参数为true表示导出私钥
       PrivateKey = rsaProvider.ToXmlString(true);
    
    
   byte[] EncryptData(byte[] data)
   {
       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
       //将公钥导入到RSA对象中,准备加密;
       rsa.FromXmlString(PublicKey);
       //对数据data进行加密,并返回加密结果;
       //第二个参数用来选择Padding的格式
       return rsa.Encrypt(data, false);
   }
    
   byte[] DecryptData(byte[] data)
   {
       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
       //将私钥导入RSA中,准备解密;
       rsa.FromXmlString(PrivateKey);
       //对数据进行解密,并返回解密结果;
       return rsa.Decrypt(data, false);
   }
    
   byte[] Sign(byte[] data)
   {
       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
       //导入私钥,准备签名
       rsa.FromXmlString(PrivateKey);
       //将数据使用MD5进行消息摘要,然后对摘要进行签名并返回签名数据
       return rsa.SignData(data, "MD5");
   }
    
   bool Verify(byte[] data, byte[] Signature)
   {
       RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(1024);
       //导入公钥,准备验证签名
       rsa.FromXmlString(PublicKey);
       //返回数据验证结果
       return rsa.VerifyData(data, "MD5", Signature);
   }


  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,作为AI助手,我不会编写代码,但我可以为您提供RAS加密算法的基本原理和C语言实现的步骤供您参考。 RAS加密算法基本原理: RAS(Rivest-Shamir-Adleman)是一种对称加密算法,具有高安全性。它使用两个密钥:公钥和私钥。公钥可以用于加密,私钥可以用于解密,因此可以用于安全地传输信息。 C语言实现步骤: 1. 生成公钥和私钥:使用数学算法生成一对公钥和私钥,公钥可以公开,私钥必须保密。 2. 加密明文:使用公钥将明文加密,生成密文。 3. 解密密文:使用私钥将密文解密,得到原始明文。 下面是一个简单的C语言实现RAS加密算法的代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <openssl/rsa.h> #include <openssl/pem.h> int main() { RSA *rsa = NULL; unsigned char *plaintext = "Hello, world!"; unsigned char *ciphertext = NULL; unsigned char *decryptedtext = NULL; int ciphertext_len, decryptedtext_len; // 生成公钥和私钥 rsa = RSA_new(); BIGNUM *e = BN_new(); BN_set_word(e, RSA_F4); RSA_generate_key_ex(rsa, 2048, e, NULL); // 加密明文 ciphertext = (unsigned char*)malloc(RSA_size(rsa)); ciphertext_len = RSA_public_encrypt(strlen(plaintext)+1, plaintext, ciphertext, rsa, RSA_PKCS1_PADDING); if(ciphertext_len == -1) { printf("加密失败!\n"); return -1; } // 解密密文 decryptedtext = (unsigned char*)malloc(ciphertext_len); decryptedtext_len = RSA_private_decrypt(ciphertext_len, ciphertext, decryptedtext, rsa, RSA_PKCS1_PADDING); if(decryptedtext_len == -1) { printf("解密失败!\n"); return -1; } // 输出结果 printf("明文:%s\n", plaintext); printf("密文:%s\n", ciphertext); printf("解密后的明文:%s\n", decryptedtext); RSA_free(rsa); free(ciphertext); free(decryptedtext); return 0; } ``` 需要注意的是,这段代码需要使用OpenSSL库,可以使用以下命令安装: ``` sudo apt-get install libssl-dev ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值