.Net常见的几种加密方式 .net密码加密
lipiwang 2024-11-04 14:34 14 浏览 0 评论
.Net加密算法主要分为:对称算法、非对称算法、哈希算法、随机算法。每种算法都有自己的使用场景,例如 保护隐私(防止查看)、保护完整性(防止更改)、数字签名、生成秘钥、秘钥交换、生成随机数等。
按照不同场景,微软建议使用的算法如下:
- 数据隐私:Aes
- 数据完整性:HMACSHA256、HMACSHA512
- 数字签名:ECDsa、RSA
- 密钥交换:ECDiffieHellman、RSA
- 随机数生成:RandomNumberGenerator
- 从密码生成密钥:Rfc2898DeriveBytes
一、私钥加密
私钥加密也称之为对称加密,因为使用的是相同的秘钥来加密、解密。对称加密是对流执行的,所以可以对大数据进行加密。对称加密速度比公钥加密速度快。对称算法要求创建秘钥和初始化向量(IV),秘钥必须保密、IV可以公开但应定期更改。常见的私钥加密有:DES、AES、HMACSHA256、HMACSHA384、HMACSHA512等。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
#region 秘钥长度
//16位密钥 = 128位
//24位密钥 = 192位
//32位密钥 = 256位
Aes aes = Aes.Create();
KeySizes[] ks = aes.LegalKeySizes;
foreach (KeySizes k in ks)
{
Console.WriteLine("\tLegal min key size = " + k.MinSize);
Console.WriteLine("\tLegal max key size = " + k.MaxSize);
Console.WriteLine("\tLegal skipsize = " + k.SkipSize);
}
//This sample produces the following output:
// Legal min key size = 128
// Legal max key size = 256
// Legal skipsize = 64
#endregion
string original = "Here is some data to encrypt!";
// Create a new instance of the Aes
// class. This generates a new key and initialization
// vector (IV).
//using (Aes myAes = Aes.Create())
//{
// var strkey = Convert.ToBase64String(myAes.Key);
// var striv = Convert.ToBase64String(myAes.IV);
//}
var strkey = "BlkUeVL1KZ/AVTo36ziIOIg+cvztnOCUlc3HNoQBs8c=";
var striv = "G2+hseZr74KJtu1BCdzdwQ==";
//Aes加密
var encrypted = AesEncrypt(original, strkey, striv);
//Aes解密
string roundtrip = AesDecrypt(encrypted, strkey, striv);
Console.WriteLine("Encrypted: {0}", encrypted);
Console.WriteLine("Round Trip: {0}", roundtrip);
Console.ReadLine();
}
/// <summary>
/// Aes加密
/// </summary>
/// <param name="plainText"></param>
/// <param name="Key"></param>
/// <param name="IV"></param>
/// <returns></returns>
static string AesEncrypt(string plainText, string strkey, string striv)
{
var Key = Convert.FromBase64String(strkey);
var IV = Convert.FromBase64String(striv);
// Check arguments.
if (plainText == null || plainText.Length <= 0)
throw new ArgumentNullException("plainText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");
byte[] encrypted;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
//密钥
aesAlg.Key = Key;
//初始化向量
aesAlg.IV = IV;
//运算模式
aesAlg.Mode = CipherMode.CBC;
//填充模式
aesAlg.Padding = PaddingMode.PKCS7;
//加密操作的块大小(以位为单位)
aesAlg.BlockSize = 128;
// Create an encryptor to perform the stream transform.
ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for encryption.
using (MemoryStream msEncrypt = new MemoryStream())
{
using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
{
using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
{
//Write all data to the stream.
swEncrypt.Write(plainText);
}
encrypted = msEncrypt.ToArray();
}
}
}
// Return the encrypted bytes from the memory stream.
//return encrypted;
return Convert.ToBase64String(encrypted);
}
/// <summary>
/// Aes解密
/// </summary>
/// <param name="text"></param>
/// <param name="Key"></param>
/// <param name="IV"></param>
/// <returns></returns>
static string AesDecrypt(string text, string strkey, string striv)
{
byte[] cipherText = Convert.FromBase64String(text);
var Key = Convert.FromBase64String(strkey);
var IV = Convert.FromBase64String(striv);
// Check arguments.
if (cipherText == null || cipherText.Length <= 0)
throw new ArgumentNullException("cipherText");
if (Key == null || Key.Length <= 0)
throw new ArgumentNullException("Key");
if (IV == null || IV.Length <= 0)
throw new ArgumentNullException("IV");
// Declare the string used to hold
// the decrypted text.
string plaintext = null;
// Create an Aes object
// with the specified key and IV.
using (Aes aesAlg = Aes.Create())
{
//密钥
aesAlg.Key = Key;
//初始化向量
aesAlg.IV = IV;
//运算模式
aesAlg.Mode = CipherMode.CBC;
//填充模式
aesAlg.Padding = PaddingMode.PKCS7;
//加密操作的块大小(以位为单位)
aesAlg.BlockSize = 128;
// Create a decryptor to perform the stream transform.
ICryptoTransform decryptor = aesAlg.CreateDecryptor(aesAlg.Key, aesAlg.IV);
// Create the streams used for decryption.
using (MemoryStream msDecrypt = new MemoryStream(cipherText))
{
using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, decryptor, CryptoStreamMode.Read))
{
using (StreamReader srDecrypt = new StreamReader(csDecrypt))
{
// Read the decrypted bytes from the decrypting stream
// and place them in a string.
plaintext = srDecrypt.ReadToEnd();
}
}
}
}
return plaintext;
}
}
}
二、公钥加密
公钥加密也称之为非对称加密,因为使用的是可公开的公钥加密数据、受保护的私钥解密数据。公钥算法是对少数字节执行的,执行速度比私钥算法慢,所以只适用于少量数据的加密,并且设计的目的也不是用于大数据加密。公钥算法也可以用与数字签名,使用私钥签名数据,公钥验证签名。
常见的公钥算法有:
- RSA:可用于加密数据和数字签名。
- DSA:只能用于数字签名,没有RSA安全。
- ECDiffieHellman:只能用于秘钥生成。
- ECDsa
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
#region netframework-4.5
//RSA
/*
Create a new instance of the RSA class.
Export the public key information and send it to a third party.
*/
//using (RSA rsa = RSA.Create())
//{
// var publicKey1 = rsa.ToXmlString(false);//公钥
// var privateKey1 = rsa.ToXmlString(true);//公钥、私钥
//}
var publicKey = "<RSAKeyValue><Modulus>38BMPKXER5pb33bslSPaibF7rrCPDFI2Ur6NQs7+Nflb3u+sLNVeNdLkO+8jevqEJRYbX8aJveTc3oCN9YqIqZVLlP9dSpbKCiJURp7KXPiBwzm4R+3KHf4SQbDU1r9ehj+FPxIHxkmRyDI8YVmrk3qSlgbcuY7WY0JFhtx8clU=</Modulus><Exponent>AQAB</Exponent></RSAKeyValue>";
var privateKey = "<RSAKeyValue><Modulus>38BMPKXER5pb33bslSPaibF7rrCPDFI2Ur6NQs7+Nflb3u+sLNVeNdLkO+8jevqEJRYbX8aJveTc3oCN9YqIqZVLlP9dSpbKCiJURp7KXPiBwzm4R+3KHf4SQbDU1r9ehj+FPxIHxkmRyDI8YVmrk3qSlgbcuY7WY0JFhtx8clU=</Modulus><Exponent>AQAB</Exponent><P>9wP5W44hIosp3xRfeWBHRlWjIj17MW4TF29YFo/lC6pZH0Onw1ARggBaRRmjZhFsrMNQQ5x+t2mItW/YQ9czpw==</P><Q>5+O0BloSYXJPxK8VMQi4gwpC7b+rqfjKlesD8TSlsmq91fvIKuOuVC7Dntbi3EVikQnuMm4gJtB5mu5x8KLZow==</Q><DP>RoMn527HHqlDJp8WMfu93OINU3ThedbGNGZgavBgndfe4QHbHfH5TXb0Tc1ny3cl4ptOij5eHdVOZRysS5Fe+Q==</DP><DQ>xD25Tl7Pi1QYGZUp0/NTYuI+PcGlXxTDLRhUn740M8eNnBeWEGXaVDe3KSclmc/GWIQU5uy3nOF06B6+oizPDQ==</DQ><InverseQ>Ukdbn+ggSHfzJq1CVL4XP5pB5CFpX+vkLJ7WoVFo1RpUKMEPtehSpKGL62fZ7fHsZzExcHhqvm5kSyXKNqGBUQ==</InverseQ><D>20WXMKP+u3Dw8giYhvuQ8fllzOcn+JoktGgbBUrW40wQlWRpZbJf1f1rP7T2H1Gb6MBGaVCmsdqz/LUc6XEuxLTAKT4sfkUlBcGS6L5GIEzNMfDwetOLQn8YCM/qsaFdNtwhl4J0CTJQkbeTLQ0rO/iWKF87F37WcUb/Jnk7h40=</D></RSAKeyValue>";
#region 数据加密
/*
Wait for the third party to encrypt some data and send it back.
*/
//1.公钥加密
var str = "我是非对称加密/公钥加密。";
var strEncrypt = "";
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKey);
//OAEP:最优非对称加密填充
//OAEP是RSA填充的一种模式,在PKCS#1v2.0(PKCS#1标准现在已经升级到2.2版本)中提出,用于取代原先的PKCS#1v1.5版本中的填充机制
strEncrypt = Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(str), true));
}
//2.私钥解密
strEncrypt = "zTDCMDIHdsAAq5kfJToaUVOqDPyucz9qAaFM0GaHCghlojpMnNk/X3NGy0WGgH62qg868yYbGPFskYtC80hY+vdewXZnCHCT+Fm9ynqcb34wLwi9SpvRT0Fd+cm9xX28sQiHb16UyKE3PS1flguvRXffPA9cAoo9phECOBlCpUo=";
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKey);
var strDecrypt = Encoding.UTF8.GetString(rsa.Decrypt(Convert.FromBase64String(strEncrypt), true));
}
#endregion
#endregion
//1.RSA加密/解密数据
/*
Create a new instance of the RSA class.
Export the public key information and send it to a third party.
*/
//using (RSA rsa = RSA.Create())
//{
// var publicKey = Convert.ToBase64String(rsa.ExportRSAPublicKey());
// var privateKey = Convert.ToBase64String(rsa.ExportRSAPrivateKey());
//}
var publicKey = "MIIBCgKCAQEA0h/4AXjUCBc5Jokw6xpQ0ubJIkWuOLTZ9R1YpBjYWWMsBDWSWaKdfEcuYA9LaJWqyHx1CSkUapn2WVfCdFz/qkpeXD64loxSSQPqp0cEDGTMELZTWYs73FtK8wObryGDVlSwTdihGJZ+ryMi1RuAcjKq8zIiZwpZRU8p8Im2LJ+xW5Zs+wFyRNNuGmc7XeRpLdWZurv0MefA/h+8eGiReYwGBwmEYxeZHvoO6FuqbmIwOHlG/v2b9Oxvy4WSzbOCOxm8cut85cUuzXMp1OyqQ7MNbcD6eCJzMwzstOhz6s36y7//7vigGbJOeJ7oAKc4mUcz54TUaTnrKgGLXCQoJQIDAQAB";
var privateKey = "MIIEowIBAAKCAQEA0h/4AXjUCBc5Jokw6xpQ0ubJIkWuOLTZ9R1YpBjYWWMsBDWSWaKdfEcuYA9LaJWqyHx1CSkUapn2WVfCdFz/qkpeXD64loxSSQPqp0cEDGTMELZTWYs73FtK8wObryGDVlSwTdihGJZ+ryMi1RuAcjKq8zIiZwpZRU8p8Im2LJ+xW5Zs+wFyRNNuGmc7XeRpLdWZurv0MefA/h+8eGiReYwGBwmEYxeZHvoO6FuqbmIwOHlG/v2b9Oxvy4WSzbOCOxm8cut85cUuzXMp1OyqQ7MNbcD6eCJzMwzstOhz6s36y7//7vigGbJOeJ7oAKc4mUcz54TUaTnrKgGLXCQoJQIDAQABAoIBAQCH4qCx4v/L06jj4Oi/wZ7vJMyB22oVxe8F8tp2FJMlC1tVxYdFbEJIMogtGvb7RX7SdJoDOIu5fKOxl21rbxDvgXSQVwdsZIZ6LYw8bVKS6USGskIosEAf+vH3QigWE6gp1k7FqQhVLE302NYX1tc0AsxGxe81j523ksBei9BB/j8eefkYBjD5NfD3yVMeGpEnfZ032QxNEuHuS+ZNQy6tMnss72vO9rCdlpkU4EAufGW9Gi/w3wUeJj0BpOpts2Q+AbeC5GKCDlEb9z9K2sMSbCc33tcYe+BnTk7QeiHRQSnK1DLg+CvLlmVZesIl1H2lgo6+uWCch1gZao6E1yapAoGBANeV4OhynZBVJRvA2RvtFVGQpW9TOpK8j2j5bNNBospeqPr0QDdovFfoLukNXRvG7XDhKR0B+ivD9mC+hHopZv2klcxIzo2spg9NoSUs0uy1FCAcC33G9UrE8C5+tstaHeSk8ahaNUab8+bN32coAAxVVwa8UFtROYnm+FHWJ/qvAoGBAPmECEW84nsxwZ0Cc8gZ84s8shzEwQIhLzo7iKMp4rw+Bblyw1pAkN75EQGFKm122i/WsQIE8dAOSzIlSWkI0pnRNAQLpXkYqwiUqEKRsNIlusl8679PAOnVWUpOQLifvxWVduFdiUw0OFdDJOj9VoOPTs1fuw4PaZYJk6UFK+9rAoGAZ8qAvWhw80wK0ZHG9OrvmJVLEI3BZWPip2duPUccWNG6CRgO0p5aDvh5nToR2Y2sQuwkHxMUnn154JnYrffA3dyfQfrLdunoCPYW3w71fYCwb8UQwz1GWvj1qWzYFI8OVUYUEjlb7OKoSjZTmBZp74Ymn9eJ2G0ChqHsa3nvRYECgYBMBe5/UQ2we3iCXjzouv95bQTXvxsPiwzYsUrwa9KpiDw2RMFAvmtlhH2p+Oj0cUIJUWCdPORwf+ppXPMBDa8dLqCqmuHQA7QY6TJbFgjJ/rTqryUlJO0iUd7ixPTzS7js2p1eDSHIFiEUdWDJnGa/rupTqNdVcVy6WjCiFvFMAQKBgHTk3mnmYA2xrc0tfF2NgqwVfWWz/WDdtHL6HYVmqxqp4rmp+an4odI2RbavMFD7ia4PZy0FZI0E9sJnrEw3akgbanoylsJ9WCowSN0UWqsI0wEZN3x05tMiKdwMY15cp0yy8LUGkWSC+BUjYCKqYsYY9TSplKIlPkXnn/2+yf8M";
/*
Wait for the third party to encrypt some data and send it back.
*/
//1.公钥加密
var str = "我是非对称加密/公钥加密。";
var strEncrypt = "";
using (var rsa = RSA.Create())
{
rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out int bytesRead);
strEncrypt = Convert.ToBase64String(rsa.Encrypt(Encoding.UTF8.GetBytes(str), RSAEncryptionPadding.Pkcs1));
}
//2.私钥解密
strEncrypt = "O1njlv9Om7VvrcGmMXXOG6+Pdk7NkRJqeeBnFpSCwhQs5NNvUmnRH3JOI0t+qEu3cfn+CAIiVE9Xp/RfKYO7dGtKonXzsSjZX1R4n1gyGMmG6tdqVnHFPFXFhUvQzEAqj5YJOGZPyiiRn6VFPl7WQcxkn5UyP+H4TMXEBqVlGSvQLe4KjwiY8zfyfNIZn+fp3W69QglJ1Wd9fLxp/9gGvPKezKu2uszEAByV/FvYFIOZr2zuGm9Tpal20q0xEKiRkVdZNs+vOTe+s6Riccj8UkdXYkVDBAkaP8fKhZ5u5qU1YORCGbOIhbUlYXIINLVsFCh+5TGWEEdDD/Sf7wqEkA==";
using (var rsa = RSA.Create())
{
rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out int bytesRead);
var strDecrypt = Encoding.UTF8.GetString(rsa.Decrypt(Convert.FromBase64String(strEncrypt), RSAEncryptionPadding.Pkcs1));
}
Console.ReadLine();
}
}
}
三、数字签名
数字签名使用的是公钥算法实现的,使用私钥签名数据、公钥验证数据,保护数据完整性。常见的数字签名算法有RSA、RSA2、ECDsa、DSA。
- RSA:全称SHA1WithRSA,对RSA密钥的长度不限制,推荐使用2048位以上。
- RSA2:全称SHA256WithRSA,强制要求RSA密钥的长度至少为2048,比RSA更加安全。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
#region netframework-4.5
//1.私钥生成签名
//The hash value to sign.
str = "我是RSA数字签名。";
byte[] hashValue = CalcSHA256(str);
byte[] signedHashValue;
string signedStr;
//Generate a public/private key pair.
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(privateKey);
//Create an RSAPKCS1SignatureFormatter object and pass it the
//RSA instance to transfer the private key.
RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
//Set the hash algorithm to SHA256.
rsaFormatter.SetHashAlgorithm("SHA256");
//Create a signature for hashValue and assign it to
//signedHashValue.
signedHashValue = rsaFormatter.CreateSignature(hashValue);
signedStr = Convert.ToBase64String(signedHashValue);
}
//2.公钥验证签名
str = "我是RSA数字签名。";
signedStr = "rhzchQiUc4/hPz1Qcx6kSz8vmDkNNX/nLIzU0NkUJe/Mq7MrQBzHC5+NguPLy86UHkQKp3z1TxnIOSYS9rKAtn2B6rbDepd2jpwTed93qsC+ZrFh2gDXbKHHZFcmcqEwj2vjOpqibynC5Y5phu4dBExSCf4KsgInMrJM17maFJg=";
hashValue = CalcSHA256(str);
signedHashValue = Convert.FromBase64String(signedStr);
using (var rsa = new RSACryptoServiceProvider())
{
rsa.FromXmlString(publicKey);
RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm("SHA256");
if (rsaDeformatter.VerifySignature(hashValue, signedHashValue))
{
Console.WriteLine("The signature is valid.");
}
else
{
Console.WriteLine("The signature is not valid.");
}
}
#endregion
#region RSA2数字签名
//1.私钥生成签名
//The hash value to sign.
var str = "我是RSA数字签名。";
byte[] hashValue = CalcSHA256(str);
byte[] signedHashValue;
string signedStr;
//Generate a public/private key pair.
using (var rsa = RSA.Create())
{
rsa.ImportRSAPrivateKey(Convert.FromBase64String(privateKey), out int bytesRead);
//Create an RSAPKCS1SignatureFormatter object and pass it the
//RSA instance to transfer the private key.
RSAPKCS1SignatureFormatter rsaFormatter = new RSAPKCS1SignatureFormatter(rsa);
//Set the hash algorithm to SHA256.
rsaFormatter.SetHashAlgorithm("SHA256");
//Create a signature for hashValue and assign it to
//signedHashValue.
signedHashValue = rsaFormatter.CreateSignature(hashValue);
signedStr = Convert.ToBase64String(signedHashValue);
}
//2.公钥验证签名
str = "我是RSA数字签名。";
signedStr = "Gt8GYpwhSE2kUyYeCsaQQyWpViMW/Gl89gJ+riXZDte0etIX00MoFzn6nzIe7fm/xESytc/VAKn2LtT+5bNarHI1vT3VdjsrPJwFNb7mJiHxMA9hyz3gRikHu1v153DejlJ1cVDgV7y8NL79OpB6qZOuPmU/sP8Om3tqCLqTUDUkNR0+kxuDI7Jpysi30zmmsIT8VpcYoV+PYoCoDLE2UJgX7oPMS8FRNajS+3GIrVstn5nh+XiavUA32sC1iZN1gfwVGQRMVuNSFkVy5xwFBiDkU90ho+HLhaSW3Zh2uQpWphHYwMZLgSItahF43WIF4w0W1Y6+P0i3zfeYGNxKGg==";
hashValue = CalcSHA256(str);
signedHashValue = Convert.FromBase64String(signedStr);
using (var rsa = RSA.Create())
{
rsa.ImportRSAPublicKey(Convert.FromBase64String(publicKey), out int bytesRead);
RSAPKCS1SignatureDeformatter rsaDeformatter = new RSAPKCS1SignatureDeformatter(rsa);
rsaDeformatter.SetHashAlgorithm("SHA256");
if (rsaDeformatter.VerifySignature(hashValue, signedHashValue))
{
Console.WriteLine("The signature is valid.");
}
else
{
Console.WriteLine("The signature is not valid.");
}
}
#endregion
Console.ReadLine();
}
private static byte[] CalcSHA1(string str)
{
using (SHA1 sha = System.Security.Cryptography.SHA1.Create())
{
var bytes = sha.ComputeHash(Encoding.UTF8.GetBytes(str));
return bytes;
}
}
private static byte[] CalcSHA256(string str)
{
using (SHA256 sha = System.Security.Cryptography.SHA256.Create())
{
var bytes = sha.ComputeHash(Encoding.UTF8.GetBytes(str));
return bytes;
}
}
}
}
四、哈希算法
哈希算法将任意长度的二进制数据映射到较小的固定长度的二进制值,数据发生改变后,数据对应的哈希值也将改变。常见的哈希算法有MD5、SHA1、SHA256、SHA384、SHA512。由于MD5和SHA1发现了漏洞不安全,不推荐使用。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
string original = "Here is some data to encrypt!";
//1.MD5加密
using (var md5 = MD5.Create())
{
var bytes = md5.ComputeHash(Encoding.UTF8.GetBytes(original));
var sb = new StringBuilder();
foreach (var item in bytes)
{
sb.Append(item.ToString("X2"));
}
Console.WriteLine(#34;MD5:{sb.ToString()}");
}
//2.SHA1加密
using (SHA1 mySHA1 = SHA1.Create())
{
var bytes = mySHA1.ComputeHash(Encoding.UTF8.GetBytes(original));
var sb = new StringBuilder();
foreach (var item in bytes)
{
sb.Append(item.ToString("X2"));
}
Console.WriteLine(#34;SHA256:{sb.ToString()}");
}
//3.SHA256加密
using (SHA256 mySHA256 = SHA256.Create())
{
var bytes = mySHA256.ComputeHash(Encoding.UTF8.GetBytes(original));
var sb = new StringBuilder();
foreach (var item in bytes)
{
sb.Append(item.ToString("X2"));
}
Console.WriteLine(#34;SHA256:{sb.ToString()}");
}
//4.SHA512加密
using (SHA512 mySHA256 = SHA512.Create())
{
var bytes = mySHA256.ComputeHash(Encoding.UTF8.GetBytes(original));
var sb = new StringBuilder();
foreach (var item in bytes)
{
sb.Append(item.ToString("X2"));
}
Console.WriteLine(#34;SHA512:{sb.ToString()}");
}
Console.ReadLine();
}
}
}
五、随机数
随机数生成是很多加密操作的必要组成部分。 例如,加密密钥需要尽可能的随机,以便使其很难再现。
using System;
using System.Collections.Generic;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Text;
namespace Demo
{
class Program
{
static void Main(string[] args)
{
var str="";
//1.RandomNumberGenerator:
#region
using (var random = RandomNumberGenerator.Create())
{
//生成32位秘钥
var bytes = new byte[32];
random.GetBytes(bytes);//用加密型强随机值序列填充字节数组。
str = Convert.ToBase64String(bytes);
Console.WriteLine(str);
}
#endregion
//2.Random:
#region
var rd = new Random();
//1.生成32位秘钥
var rdbytes = new byte[32];
rd.NextBytes(rdbytes);
str = Convert.ToBase64String(rdbytes);
Console.WriteLine(str);
//2.随机生成1-100的整数。
for (int i = 0; i < 10; i++)
{
var num = rd.Next(0, 101);//生成介于指定下限(含)与指定上限(不含)之间的随机整数。
Console.WriteLine(num);
}
//3. 随机生成姓名
string[] malePetNames = { "Rufus", "Bear", "Dakota", "Fido",
"Vanya", "Samuel", "Koani", "Volodya",
"Prince", "Yiska" };
Random rnd = new Random();
// Generate random indexes for pet names.
int mIndex = rnd.Next(malePetNames.Length);
// Display the result.
Console.WriteLine("Suggested pet name of the day: ");
Console.WriteLine(" For a male: {0}", malePetNames[mIndex]);
//4.指定种子
//使用的种子相同,生成的随机数也相同。
var seed = (int)DateTime.Now.Ticks;
var rd1 = new Random(seed);
var rd2 = new Random(seed);
Console.WriteLine(rd1.Next());
Console.WriteLine(rd2.Next());
// The example displays output similar to the following:
// 2004787064
// 2004787064
#endregion
Console.ReadLine();
}
}
}
- 上一篇:AES加密/解密 AES加密解密网站
- 下一篇:「爬虫知识」爬虫常见加密解密算法
相关推荐
- 前端入门——css 网格轨道详细介绍
-
上篇前端入门——cssGrid网格基础知识整体大概介绍了cssgrid的基本概念及使用方法,本文将介绍创建网格容器时会发生什么?以及在网格容器上使用行、列属性如何定位元素。在本文中,将介绍:...
- Islands Architecture(孤岛架构)在携程新版首页的实践
-
一、项目背景2022,携程PC版首页终于迎来了首次改版,完成了用户体验与技术栈的全面升级。作为与用户连接的重要入口,旧版PC首页已经陪伴携程走过了22年,承担着重要使命的同时,也遇到了很多问题:维护/...
- HTML中script标签中的那些属性
-
HTML中的<script>标签详解在HTML中,<script>标签用于包含或引用JavaScript代码,是前端开发中不可或缺的一部分。通过合理使用<scrip...
- CSS 中各种居中你真的玩明白了么
-
页面布局中最常见的需求就是元素或者文字居中了,但是根据场景的不同,居中也有简单到复杂各种不同的实现方式,本篇就带大家一起了解下,各种场景下,该如何使用CSS实现居中前言页面布局中最常见的需求就是元...
- CSS样式更改——列表、表格和轮廓
-
上篇文章主要介绍了CSS样式更改篇中的字体设置Font&边框Border设置,这篇文章分享列表、表格和轮廓,一起来看看吧。1.列表List1).列表的类型<ulstyle='list-...
- 一文吃透 CSS Flex 布局
-
原文链接:一文吃透CSSFlex布局教学游戏这里有两个小游戏,可用来练习flex布局。塔防游戏送小青蛙回家Flexbox概述Flexbox布局也叫Flex布局,弹性盒子布局。它决定了...
- css实现多行文本的展开收起
-
背景在我们写需求时可能会遇到类似于这样的多行文本展开与收起的场景:那么,如何通过纯css实现这样的效果呢?实现的难点(1)位于多行文本右下角的展开收起按钮。(2)展开和收起两种状态的切换。(3)文本...
- css 垂直居中的几种实现方式
-
前言设计是带有主观色彩的,同样网页设计中的css一样让人摸不头脑。网上列举的实现方式一大把,或许在这里你都看到过,但既然来到这里我希望这篇能让你看有所收获,毕竟这也是前端面试的基础。实现方式备注:...
- WordPress固定链接设置
-
WordPress设置里的最后一项就是固定链接设置,固定链接设置是决定WordPress文章及静态页面URL的重要步骤,从站点的SEO角度来讲也是。固定链接设置决定网站URL,当页面数少的时候,可以一...
- 面试发愁!吃透 20 道 CSS 核心题,大厂 Offer 轻松拿
-
前端小伙伴们,是不是一想到面试里的CSS布局题就发愁?写代码时布局总是对不齐,面试官追问兼容性就卡壳,想跳槽却总被“多列等高”“响应式布局”这些问题难住——别担心!从今天起,咱们每天拆解一...
- 3种CSS清除浮动的方法
-
今天这篇文章给大家介绍3种CSS清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。首先,这里就不讲为什么我们要清楚浮动,反正不清除浮动事多多。下面我就讲3种常用清除浮动的...
- 2025 年 CSS 终于要支持强大的自定义函数了?
-
大家好,很高兴又见面了,我是"高级前端进阶",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!1.什么是CSS自定义属性CSS自...
- css3属性(transform)的一个css3动画小应用
-
闲言碎语不多讲,咱们说说css3的transform属性:先上效果:效果说明:当鼠标移到a标签的时候,从右上角滑出二维码。实现方法:HTML代码如下:需要说明的一点是,a链接的跳转需要用javasc...
- CSS基础知识(七)CSS背景
-
一、CSS背景属性1.背景颜色(background-color)属性值:transparent(透明的)或color(颜色)2.背景图片(background-image)属性值:none(没有)...
- CSS 水平居中方式二
-
<divid="parent"><!--定义子级元素--><divid="child">居中布局</div>...
你 发表评论:
欢迎- 一周热门
- 最近发表
- 标签列表
-
- maven镜像 (69)
- undefined reference to (60)
- zip格式 (63)
- oracle over (62)
- date_format函数用法 (67)
- 在线代理服务器 (60)
- shell 字符串比较 (74)
- x509证书 (61)
- localhost (65)
- java.awt.headless (66)
- syn_sent (64)
- settings.xml (59)
- 弹出窗口 (56)
- applicationcontextaware (72)
- my.cnf (73)
- httpsession (62)
- pkcs7 (62)
- session cookie (63)
- java 生成uuid (58)
- could not initialize class (58)
- beanpropertyrowmapper (58)
- word空格下划线不显示 (73)
- jar文件 (60)
- jsp内置对象 (58)
- makefile编写规则 (58)