1.对称密钥
2.不对称密钥
3.将非对称密钥存储在密钥容器中
4.将非对称密钥存储在密钥容器中示例
===============================

创建和管理密钥是加密过程的一个重要部分。
对称算法要求创建必须对不应解密数据的任何人保密的密钥和初始化向量 (IV)。
不对称算法要求创建一个公钥和一个私钥。
公钥可以对任何人公开,
而私钥必须只为将要对用公钥加密的数据进行解密的一方知道。

对称密钥
========
.NET Framework 提供的对称加密类
需要一个密钥和一个新的初始化向量 (IV) 来加密和解密数据。
每当使用默认构造函数创建某个托管对称加密类的新实例时,
都将自动创建新的密钥和 IV。
无论您允许谁解密您的数据,
他或她都必须拥有同样的密钥和 IV 并使用相同的算法。
通常,应该为每个会话创建新的密钥和 IV,
并且无论是密钥还是 IV 都不应存储以用于稍后的会话中。

为了将对称密钥和 IV 传送给远程方,
通常使用不对称加密来加密对称密钥和 IV。
通过不安全的网络发送这些值而不对这些值进行加密会极不安全,
这是因为截获这些值的任何人都能够解密您的数据。

下面的示例显示
实现TripleDES 算法的 TripleDESCryptoServiceProvider 类的新实例的创建。

Visual Basic:
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()

C#:
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();

在执行上面的代码时,将生成新的密钥和 IV 并将其分别放置在 Key 和 IV 属性中。

有时您可能需要生成多个密钥。
这种情况下,可以创建实现对称算法的类的新实例,
然后通过调用 GenerateKey 和 GenerateIV 方法创建新的密钥和 IV。
下面的代码示例阐释如何在创建了不对称加密类的新实例后创建新的密钥和 IV。

Visual Basic :
Dim TDES As TripleDESCryptoServiceProvider = new TripleDESCryptoServiceProvider()
TDES.GenerateIV()
TDES.GenerateKey()

C# :
TripleDESCryptoServiceProvider TDES = new TripleDESCryptoServiceProvider();
TDES.GenerateIV();
TDES.GenerateKey();

当执行上面的代码时,创建 TripleDESCryptoServiceProvider 的新实例后将生成密钥和 IV。
调用 GenerateKey 和 GenerateIV 方法时将创建另一个密钥和 IV。

不对称密钥
==========
.NET Framework 为不对称加密提供了
RSACryptoServiceProvider 和 DSACryptoServiceProvider 类。
这些类在您使用默认构造函数创建新实例时创建一个公钥/私钥对。
既可以存储不对称密钥以用在多个会话中,
也可以只为一个会话生成不对称密钥。
公钥可以被广泛地使用,私钥应被严密地保护起来。

每当创建不对称算法类的新实例时,都生成一个公钥/私钥对。
创建该类的新实例后,可以用以下两种方法之一提取密钥信息:

ToXMLString 方法,它返回密钥信息的 XML 表示形式。
ExportParameters 方法,它返回 RSAParameters 结构以保存密钥信息。
两个方法都接受布尔值,该值指示是只返回公钥信息还是同时返回公钥和私钥信息。

通过使用 ImportParameters 方法,
可以将 RSACryptoServiceProvider 类初始化为 RSAParameters 结构的值。

千万不要将不对称私钥逐字存储(或者说以明文形式存储)在本地计算机上。
如果需要存储私钥,则应使用密钥容器。
有关如何在密钥容器中存储私钥的更多信息,
请参见如何:将非对称密钥存储在密钥容器中。

下面的代码示例创建 RSACryptoServiceProvider 类的一个新实例,
创建一个公钥/私钥对,并将公钥信息保存在 RSAParameters 结构中。

Visual Basic  复制代码
'Generate a public/private key pair.
Dim RSA as RSACryptoServiceProvider = new RSACryptoServiceProvider()
'Save the public key information to an RSAParameters structure.
Dim RSAKeyInfo As RSAParameters = RSA.ExportParameters(false)

C#  复制代码
//Generate a public/private key pair.
RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
//Save the public key information to an RSAParameters structure.
RSAParameters RSAKeyInfo = RSA.ExportParameters(false);
 
将非对称密钥存储在密钥容器中
============================

创建非对称密钥并将其保存在密钥容器中
------------
1.创建 CspParameters 类的一个新实例,
  并将您要密钥容器使用的名称传递给 CspParameters.KeyContainerName 字段。
2.为从 AsymmetricAlgorithm 类派生的一个类
 (通常是 RSACryptoServiceProvider 或 DSACryptoServiceProvider)创建一个新实例,
  并将先前创建的 CspParameters 对象传递给其构造函数。

从密钥容器中删除密钥
------------
1.创建 CspParameters 类的一个新实例,
  并将您要密钥容器使用的名称传递给 CspParameters.KeyContainerName 字段。
2.为从 AsymmetricAlgorithm 类派生的一个类
(通常是 RSACryptoServiceProvider 或 DSACryptoServiceProvider)创建一个新实例,
 并将先前创建的 CspParameters 对象传递给其构造函数。
3.将从 AsymmetricAlgorithm 中派生的类
  的 PersistKeyInCSP 属性设置为 false(在 Visual Basic 中为 False)。
4.调用从 AsymmetricAlgorithm 派生的类的 Clear 方法。
  该方法释放该类所有的资源并清除密钥容器。

将非对称密钥存储在密钥容器中示例
====
下面的示例说明下面这一过程:
创建一个非对称密钥,将其保存在密钥容器中,
以后检索此密钥,最后从该容器中删除此密钥。

请注意,GenKey_SaveInContainer 方法和 GetKeyFromContainer 方法的代码相似。
当为 CspParameters 对象指定密钥容器名称并将其传递给 PersistKeyInCsp 属性
   或 PersistKeyInCsp 属性设置为 true 的 AsymmetricAlgorithm 对象时,
  将会发生以下情况。
  如果不存在具有指定名称的密钥容器,
        则系统将创建一个密钥容器,但密钥保持不变。
  如果确实存在具有指定名称的密钥容器,
        则将此容器中的密钥自动加载到当前 AsymmetricAlgorithm 对象中。
  因此,GenKey_SaveInContainer 方法中的代码保持密钥不变,因为它首先运行;
  而 GetKeyFromContainer 方法中的代码加载此密钥,因为它随后运行。

Visual Basic  复制代码
Imports System
Imports System.IO
Imports System.Security.Cryptography
 _

Public Class StoreKey

Public Shared Sub Main()
        Try
            ' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

' Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer")

' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")

' Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer")

' Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer")
        Catch e As CryptographicException
            Console.WriteLine(e.Message)
        End Try
    End Sub

Public Shared Sub GenKey_SaveInContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        ' name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

' Display the key information to the console.
        Console.WriteLine("Key added to container:  {0}", rsa.ToXmlString(True))
    End Sub

Public Shared Sub GetKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container MyKeyContainerName.
        Dim rsa As New RSACryptoServiceProvider(cp)

' Display the key information to the console.
        Console.WriteLine("Key retrieved from container : {0}", rsa.ToXmlString(True))
    End Sub

Public Shared Sub DeleteKeyFromContainer(ByVal ContainerName As String)
        ' Create the CspParameters object and set the key container
        '  name used to store the RSA key pair.
        Dim cp As New CspParameters()
        cp.KeyContainerName = ContainerName

' Create a new instance of RSACryptoServiceProvider that accesses
        ' the key container.
        Dim rsa As New RSACryptoServiceProvider(cp)

' Delete the key entry in the container.
        rsa.PersistKeyInCsp = False

' Call Clear to release resources and delete the key from the container.
        rsa.Clear()

Console.WriteLine("Key deleted.")
    End Sub
End Class

C#  复制代码
using System;
using System.IO;
using System.Security.Cryptography;

public class StoreKey

{
    public static void Main()
    {
        try
        {
            // Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");
           
            // Retrieve the key from the container.
            GetKeyFromContainer("MyKeyContainer");
   
            // Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");

// Create a key and save it in a container.
            GenKey_SaveInContainer("MyKeyContainer");

// Delete the key from the container.
            DeleteKeyFromContainer("MyKeyContainer");
        }
        catch(CryptographicException e)
        {
            Console.WriteLine(e.Message);
        }

}

public static void GenKey_SaveInContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Display the key information to the console.
        Console.WriteLine("Key added to container: \n  {0}", rsa.ToXmlString(true));
    }

public static void GetKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
        // the key container MyKeyContainerName.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Display the key information to the console.
        Console.WriteLine("Key retrieved from container : \n {0}", rsa.ToXmlString(true));
    }

public static void DeleteKeyFromContainer(string ContainerName)
    {
        // Create the CspParameters object and set the key container
        // name used to store the RSA key pair.
        CspParameters cp = new CspParameters();
        cp.KeyContainerName = ContainerName;

// Create a new instance of RSACryptoServiceProvider that accesses
        // the key container.
        RSACryptoServiceProvider rsa = new RSACryptoServiceProvider(cp);

// Delete the key entry in the container.
        rsa.PersistKeyInCsp = false;

// Call Clear to release resources and delete the key from the container.
        rsa.Clear();

Console.WriteLine("Key deleted.");
    }
}

输出
 
Key added to container:
<RSAKeyValue> Key Information A</RSAKeyValue>
Key retrieved from container :
<RSAKeyValue> Key Information A</RSAKeyValue>
Key deleted.
Key added to container:
<RSAKeyValue> Key Information B</RSAKeyValue>
Key deleted.

转载于:https://www.cnblogs.com/freeliver54/archive/2007/03/05/664695.html

[引]生成加密和解密的密钥相关推荐

  1. [密码学基础][每个信息安全博士生应该知道的52件事][Bristol Cryptography][第15篇]RSA-OAEP和ECIES的密钥生成,加密和解密

    这是一系列博客文章中最新的一篇,该文章列举了"每个博士生在做密码学时应该知道的52件事":一系列问题的汇总是为了让博士生们在第一年结束时知道些什么.通过描述RSA-OAEP和ECI ...

  2. RSA分段加密分段解密以及密钥与.Net的转化

    代码中采用了Base64 对应的Maven仓库地址 <!-- http://mvnrepository.com/artifact/net.iharder/base64 --> <de ...

  3. 数字证书应用综合揭秘(包括证书生成、加密、解密、签名、验签)

    引言 数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件.为现实网络安全化标准如今大部分的 B2B.B2C.P2P.O2O 等商业网站含有重要企业资料个人资料的信息资信网站 ...

  4. php版本kms,使用 AWS KMS 加密和解密 AWS SDK for PHP 数据密钥 - 适用于 PHP 的 AWS 开发工具包...

    AWS 文档中描述的 AWS 服务或功能可能因区域而异.要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门. 本文属于机器翻译版本.若本译文内容与英语原文存在差异,则一律以英文原文为准. 使用 ...

  5. JavaScript加密/解密与OpenAI的对接:生成加密对话的ChatGPT 4.0应用

    首先,我们来看一个简单的JavaScript加密算法的示例,该算法将输入的字符串每个字符的ASCII值加上1,并返回一个新的字符串.以下是加密函数的代码: javascriptCopy codefun ...

  6. 加密与解密以及openssl的应用

    废话不多说,直入主题. 本文主要简单介绍下: 一.数据加密的三种方式: 二.Openssl的基础应用以及创建CA证书与发证: 一.数据加密的三种方式: 1.对称加密:加密与解密方使用同一个算法, 将数 ...

  7. S-DES加密与解密

    S-DES加密解密流程图: S-DES是DES算法的简化版,并没有什么实际使用的价值,只用于教学来理解DES算法的加密方法,这篇文章就是按照S-DES的算法来实际加密和解密的一段2进制数,演示了加密的 ...

  8. java中的Cipher类 (加密和解密)

     该类位于javax.crypto包下,声明为 public class Cipher extends Object 此类为加密和解密提供密码功能.它构成了 Java Cryptographic ...

  9. 【Android】Android加密和解密方式

    一.不可逆加密 不可逆加密算法的特征是加密过程中不需要使用密钥,输入明文后由系统直接经过加密算法处理成密文,这种加密后的数据是无法被解密的,只有重新输入明文,并再次经过同样不可逆的加密算法处理,得到相 ...

最新文章

  1. 大连理工本科生顶会连刷SOTA被爆作弊!AAAI 2022接收后又面临撤稿,一作仍未发声...
  2. 教育部回应:没有使用“第一学历”这个概念!
  3. ios app提交之前需要哪几个证书
  4. 人脸识别最新进展——几篇相关论文总结
  5. php ab压力测试,安装Xcache缓存加速php及ab压力测试结果
  6. 从数学到计算机 从莱布尼兹到冯诺依曼 从数理逻辑到算法分析
  7. 使用bat向文件的第一行中写入内容
  8. C/C++浮点数在内存中的存储方式《转》
  9. form表单提交数据
  10. 16. CSS 轮廓
  11. 资深码农教你写详细设计(附示例模板)
  12. 智慧城市——数字化城市管理平台系统建设方案
  13. Linux下ALSA驱动分析
  14. linux表白程序源码,程序员表白程序,开放源码在此!
  15. 16S测序 生物信息数据处理
  16. 伟大的UHD编解码器的辩论:谷歌VP9与HEVC / H.265
  17. 4054原厂LTH7R座充充电管理IC
  18. conan入门(二):conan 服务配置-密码管理及策略
  19. 区块链系统有服务器吗,区块链需要服务器吗
  20. 禁用计算机硬盘,禁止电脑每次开机都要自动扫描磁盘的多种方法

热门文章

  1. 学分绩点计算编程java_方便我们计算学分绩点的JavaScript
  2. React学习,Babel ES6兼容运行使用的命令行整理
  3. 什么是编译器?(程序是怎么跑起来的)
  4. 《Head First设计模式》第六章笔记-命令模式
  5. 关于wParam和lParam
  6. 计算机基础知识整理 手抄报,科技小制作的手抄报资料简单字少
  7. mysql二进制方式_MySQL数据库之MySql二进制连接方式详解
  8. python两个for循环为什么第二个循环里值不变_两个for循环,第二个只在第一个迭代python上执行...
  9. 牛客网C++面经 C++11
  10. finally语句与return语句的执行顺序