.net 加密模型的学习笔记

学习笔记

学习加密模型的笔记:最近,突然来了一些对接第三方的接口任务。搞得自己晕晕乎乎的。 主要原因 学习及基础有限,对加密的理解不到位。所以主要学习了, .net 的加密模型。

进入主题:

加密基元 用途
私钥加密(对称加密被第三方读取。 此类型的加密使用公钥/私钥对来加密和解密数据。
加密签名 通过创建特定于参与方的数字签名,帮助验证数据是否来自此特定方。 此流程也使用哈希函数。
加密哈希 将任意长度的数据映射到固定长度的字节序列。 哈希值在统计上是唯一的;不同的双字节序列不会有哈希处理为同一个值。

就这问题给的顺序学习

1 、需要密钥 加密的类型;就是对称加密 加密解密都用一个Key

对称加密是对流执行的因此适用于加密大量数据

 * Aes : 
 * HMACSHA256、HMACSHA384 和 HMACSHA512。
     (这些是技术上的机密密钥算法,因为它们表示
     消息身份验证代码,这些代码是通过将加密哈希函数与密钥结合使用来计算的。
     请参阅本文后面部分的 哈希值)
1.1 Aes
他的关键信息,需要我们记录 的是 Key IV Mode,Mode 尽量 用CBC 的安全一些,
1.2 Aes 密钥生成 获取方式
     public (byte[], byte[] , CipherMode) GetAESKeysAndIV()
    {
        SymmetricAlgorithm aes = Aes.Create();
        aes.GenerateIV();
        aes.GenerateKey();
        return (aes.Key, aes.IV,aes.Mode);
    }
2 公钥加密的类

非对称加密是对少数字节执行的,因此仅适用于加密少量数据
公钥算法的使用比私钥算法的更受限制。非对称私钥永远不应以原义或纯文本形式存储在本地计算机上 如果需要存储私钥,请使用密钥容器。 有关密钥容器的详细信息

* RSA 允许加密和签名
* ECDsa 签名算法的类
* ECDiffieHellman 只能用于密钥生成
* DSA 仅可用于签名 不如 RSA 那么安全
2.1 RSA

使用无参数 Create() 方法创建新的实例时,此类将创建一个公钥/私钥对

2.2 RSA 公钥/密钥生成 获取方式
public RSAParameters GetRSAKeyAndPublicKeyParameters()
{
    using (RSACryptoServiceProvider rsa = new RSACryptoServiceProvider())
    {
        return rsa.ExportParameters(true);
    }
}
2.3 RSA 加密

这里说明的是:加你需要 公钥 modulus,和 质数 exponent  就可以 手动实例化 RSAParamter  设置后 就可加密

RSAParameters rsaKeyInfo = new RSAParameters();
    //Set rsaKeyInfo to the public key values.
    rsaKeyInfo.Modulus = modulus;
    rsaKeyInfo.Exponent = exponent;

加密方法 Encrypt 的第二个参数是 说明

类型 说明
Mode 获取此 RSAEncryptionPadding 实例所表示的填充模式。
OaepHashAlgorithm 获取与 Oaep 填充模式结合使用的哈希算法。
OaepSHA1 获取一个对象,该对象表示最优非对称加密填充 (OAEP) 加密标准(包含 SHA1 哈希算法)。
OaepSHA256 获取一个表示使用 SHA256 哈希算法的最优非对称加密填充 (OAEP) 加密标准的对象。
OaepSHA384 获取一个表示使用 SHA-384 哈希算法的最优非对称加密填充 (OAEP) 加密标准的对象。
OaepSHA512 获取一个表示使用 SHA512 哈希算法的最优非对称加密填充 (OAEP) 加密标准的对象。
Pkcs1 获取一个表示 PKCS #1 加密标准的对象。
3 加密哈希 也就是单向加密

加密数字签名使用公钥算法提供数据完整性。 如果使用数字签名对数据进行签名,则其他人可验证该签名,并且可证明这些数据确实是你发出的,并且在你签名之后未被更改
数字签名通常应用于表示较大数据的哈希值。

* SHA256.
* SHA384.
* SHA512.
* .NET 还提供了 MD5 和 SHA1 。 但是,MD5 和 SHA-1 算法已发现不安全
4 下一代加密技术 (CNG) 类

下一代加密技术 (CNG) 类提供了围绕本机 CNG 函数的托管包装。 (CNG 是 CryptoAPI 的替代。 ) 这些类的名称包含 "Cng"。 “中心到 CNG”包装类是 CngKey 密钥容器类,它将提取 CNG 密钥的存储和用法。 此类允许安全地存储密钥对或公钥并使用简单的字符串名称对其进行引用。 基于椭圆曲线的 ECDsaCng 签名类和 ECDiffieHellmanCng 加密类可以使用 CngKey 对象。 CngKey 类用于各种其他操作,包括打开、创建、删除和导出密钥。 在直接调用本机函数时,它还提供对要使用的基础密钥句柄的访问。 .NET 还包括各种支持的 CNG 类,如下所示:

* CngProvider 维护密钥存储提供程序。
* CngAlgorithm 维护 CNG 算法。
* CngProperty 维护经常使用的密钥属性。

这是一个 DSA 的 用于签名

class Alice
{
    public static void Main(string[] args)
    {
        Bob bob = new Bob();
        using (ECDsaCng dsa = new ECDsaCng())
        {
            dsa.HashAlgorithm = CngAlgorithm.Sha256;
             bob.key = dsa.Key.Export(CngKeyBlobFormat.EccPublicBlob);

             byte[] data = new byte[] { 21, 5, 8, 12, 207 };

             byte[] signature = dsa.SignData(data);

             bob.Receive(data, signature);
            }
    }
}
public class Bob
{
    public byte[] key;

    public void Receive(byte[] data, byte[] signature)
    {
        using (ECDsaCng ecsdKey = new ECDsaCng(CngKey.Import(key, CngKeyBlobFormat.EccPublicBlob)))
        {
            if (ecsdKey.VerifyData(data, signature))
                Console.WriteLine("Data is good");
            else
                Console.WriteLine("Data is bad");
        }
    }
}

总结

  • 如果 Hash 用 SHA-i i=256 ,512 等等,
  • 诗句保证 用 AES 对称坚弥 或者 RSA 公钥加密 密钥解密
  • 验证数据签名 用 RSA 私钥加盟 公钥 验证。或者 用其他 如DSA
  • 下一带的加密信息用似乎 *Cng  用CngKey 配置 *Cng(CngKey)处理
  • 接下来要对每个加密算法 进行理论学习才能灵活使用 否则 还是白搭 ,但是工具类已经很完善了


猜你喜欢

转载自blog.51cto.com/3478586/2675641