(C#基础)各种加密学习

之前,一直想对这个做一个了解,但是总是坚持不下去,很急躁。最近看了几遍文章,很有感触,于是又来重新开始学习,从最最基础的开始——正所谓“慢就是快”。心态变了,继续吧!上代码!

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Security.Cryptography;

namespace dazilianxi.wenjian
{
    public class RSACryptoHelper
    {
        //加密
        public static string Encrypt(string publicKeyXml, string plainText)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml); //使用公匙初始化对象
            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] encryptedData = provider.Encrypt(plainData, true);
            return Convert.ToBase64String(encryptedData);
        }

        //解密
        public static string Decrypt(string privateKeyXml, string encryptedText)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);
            byte[] encryptedData = Convert.FromBase64String(encryptedText);
            byte[] plainData = provider.Decrypt(encryptedData, true);
            string plainText = Encoding.Default.GetString(plainData);
            return plainText;
        }
        public static KeyValuePair<string, string> CreateRSAKey()
        {
            RSACryptoServiceProvider RSA = new RSACryptoServiceProvider();
            string privateKey = RSA.ToXmlString(true);
            string publicKey = RSA.ToXmlString(false);

            return new KeyValuePair<string, string>(publicKey, privateKey);
        }

        public static string SignData(string plainText, string privateKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            //设置获取摘要的算法
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            //获取签名过的摘要,是使用私匙加密过的摘要
            byte[] signedDigest = provider.SignData(plainData, sha1);
            return Convert.ToBase64String(signedDigest);
        }

        public static bool VerifyData(string plainText, string signature, string publicKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] signedDigest = Convert.FromBase64String(signature);

            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            bool isDataIntact = provider.VerifyData(plainData, sha1, signedDigest);
            return isDataIntact;
        }

        //使用SingnHash
        public static string SignData2(string plainText, string privateKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(privateKeyXml);
            byte[] plainData = Encoding.Default.GetBytes(plainText);

            //设置获取摘要的算法
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            //获得原始摘要
            byte[] digestData = sha1.ComputeHash(plainData);
            //对元素摘要进行签名
            byte[] signedDigest = provider.SignHash(digestData, "SHA1");
            return Convert.ToBase64String(signedDigest);
        }

        //使用VerifyHash
        public static bool VerifyData2(string plainText, string signedDigest, string publicKeyXml)
        {
            RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            provider.FromXmlString(publicKeyXml);

            byte[] plainData = Encoding.Default.GetBytes(plainText);
            byte[] signedDigestData = Convert.FromBase64String(signedDigest);

            //获得本地摘要
            HashAlgorithm sha1 = HashAlgorithm.Create("SHA1");
            byte[] digest = sha1.ComputeHash(plainData);

            //解密签名
            bool isDataIntact = provider.VerifyHash(digest, "SHA1", signedDigestData);
            return isDataIntact;
        }
    }
}
  RSACryptoServiceProvider provider = new RSACryptoServiceProvider();
            string publicPrivate = provider.ToXmlString(true);//获得公/私匙对
           // string publicOnly = provider.ToXmlString(false); //只获得公匙
           // string key = "secret key";
            string str = "hello world";
           // string str2 = "hello world";
            //加密
            string encryptedText = RSACryptoHelper.Encrypt(publicPrivate, str);
            Console.WriteLine(encryptedText);
            //学到了重构,this 在构造函数中的灵活运用。不能直接满足条件,就要想方设法创造合适的。
            //解密
            string clearText = RSACryptoHelper.Decrypt(publicPrivate, encryptedText);
            Console.WriteLine(clearText);

            string originalData = "文章不错,这是我的签名:奥巴马!";
            Console.WriteLine("签名数为:{0}", originalData);

            KeyValuePair<string, string> keyPair =RSACryptoHelper.CreateRSAKey();
            string privateKey = keyPair.Value;
            string publicKey = keyPair.Key;
            //1、生成签名,通过摘要算法
            string signedData = RSACryptoHelper.SignData(originalData, privateKey);
            Console.WriteLine("数字签名1:{0}", signedData);

            //2、验证签名
            bool verify = RSACryptoHelper.VerifyData(originalData, signedData, publicKey);
            Console.WriteLine("签名验证结果:{0}", verify);

            string signedData2 = RSACryptoHelper.SignData2(originalData, privateKey);
            Console.WriteLine("数字签名2:{0}", signedData2);

            //2、验证签名
            bool verify2 = RSACryptoHelper.VerifyData2(originalData, signedData2, publicKey);
            Console.WriteLine("签名验证结果2:{0}", verify2);

参考,延伸学习:

数据加密:http://www.cnblogs.com/yank/p/3528548.html

数字签名:http://www.cnblogs.com/yank/p/3533998.html

证书:http://www.cnblogs.com/Microshaoft/archive/2009/05/19/1460641.html

加密:http://www.cnblogs.com/Microshaoft/archive/2008/07/21/1247584.html

加密:http://www.cnblogs.com/darrenji/p/3677458.html

时间: 2024-10-29 19:06:34

(C#基础)各种加密学习的相关文章

python基础教程_学习笔记16:标准库:一些最爱——random

标准库:一些最爱 random random模块包括返回随机数的函数,可以用于模拟或者用于任何产生随机输出的程序. 事实上,所产生的数字都是伪随机数,它们以一个可预测的系统作为基础,除非是为了强加密的目标,否则这些随机数还是足够随机的.如果真的需要随机性,可以使用os模块的urandom函数. 重要函数 函数 描述 random() 返回0<=n<1之间的随机实数n,其中0<n<=1 getrandbits(n) 以长整型形式返回n个随机位(二进制数) uniform(a,b) 返

python基础教程_学习笔记20:标准库:一些最爱——os

标准库:一些最爱 os os模块为你提供了访问多个操作系统服务的功能. os和它的子模块os.path还包括一些用于检查.构造.删除目录和文件的函数,以及一些处理路径的函数. os模块中一些重要函数和变量 函数/变量 描述 environ 对环境变量进行映射 system(command) 在子shell中执行操作系统命令 sep 路径中的分隔符 pathsep 分隔路径的分隔符 linesep 行分隔符('\n','\r','\r\n') urandom(n) 返回n字节的加密强随机数据 os

《语义网基础教程》学习笔记(二)

二.RDF概述(参考http://zh.transwiki.org/cn/rdfprimer.htm) 1.本体: 一个本体是一个概念体系(conceptualization)的显式的形式化规范. 一般来说,一个本体形式地刻画一个论域.一个典型的本体由有限个术语及它们之间的关系组成. ★在万维网这个环境中,本体提供了对给定领域的一种共识.这种共识对于消除术语差别是必要的. 通过把各自的术语差异映射到一个公共的本体之间的直接映射,可以消除这些术语差异. 不管采用哪种方案,本体都支持语义可共用性(s

python基础教程_学习笔记23:图形用户界面

图形用户界面 丰富的平台 在编写Python GUI程序前,需要决定使用哪个GUI平台. 简单来说,平台是图形组件的一个特定集合,可以通过叫做GUI工具包的给定Python模块进行访问. 工具包 描述 Tkinter 使用Tk平台.很容易得到.半标准. wxpython 基于wxWindows.跨平台越来越流行. PythonWin 只能在Windows上使用.使用了本机的Windows GUI功能. JavaSwing 只能用于Jython.使用本机的Java GUI. PyGTK 使用GTK

python基础教程_学习笔记3:元组

元组 元组不能修改:(可能你已经注意到了:字符串也不能修改.) 创建元组的语法很简单:如果用逗号分隔了一些值,那么你就自动创建了元组. >>> 1,3,'ab' (1, 3, 'ab') 元组也是(大部分时候是)通过圆括号括起来的. >>> (1,3,'13') (1, 3, '13') 空元组可以用没有内容的两个圆括号来表示. 如何实现包括一个值的元组呢? >>> (5) 5 >>> ('ab') 'ab' >>>

蓝鸥Unity开发基础——If 语句学习笔记

蓝鸥Unity开发基础--If 语句学习笔记 本节内容:程序的三种结构,if语句,问号表达式 程序的三种结构 顺序结构:顺序执行语句 分支结构:通过进行判断,在多个语句块中选择某一个执行 循环结构:条件满足时,反复执行同一语句块 If语句 用if语句可以构成分支结构 它根据给定的条件进行判定,用来决定要执行某个程序段 一.if(条件表达式){语句1} using System; namespace Lesson11{    class MainClass    {        public s

《语义网基础教程》学习笔记(一)

一.XML概述 1.有效(valid)的XML文档:遵守了XML文档的基本规则,并使用DTD或Schema定义了语义约束,而且也完全遵守了DTD或Schema所定义的语义约束的XML文档 2.XML声明部分的encoding属性值应该与保存该文档所使用的字符集相同.如果需要让XML支持中文,应该注意以下几点: ①保存文件时使用支持中文的字符集 ②XML声明部分的encoding属性应该与保存该文件时所使用的字符集相同 3.XML元素里的多个属性之间是无序的,因此同一个元素不可包含多个同名的属性,

python基础教程_学习笔记9:抽象

抽象 懒惰即美德. 抽象和结构 抽象可以节省大量工作,实际上它的作用还要更大,它是使得计算机程序可以让人读懂的关键. 创建函数 函数可以调用(可能包含参数,也就是放在圆括号中的值),它执行某种行为并且返回一个值.一般来说,内建的callable函数可以用来判断函数是否可调用: >>> import math >>> y=1 >>> x=math.sqrt >>> callable(x) True >>> callab

python基础教程_学习笔记10:异常

异常 什么是异常 Python用异常对象来表示异常情况.遇到错误后,会引发异常.如果异常对象并未被处理或捕捉,程序就会用所谓的回溯(Traceback,一种错误信息)终止执行: >>> 1/0 Traceback (most recent call last): File "<pyshell#0>", line 1, in <module> 1/0 ZeroDivisionError: integer division or modulo by