前言

说起加密方式,其实密码学的角度ASCII编码其实本身就是一种加密解密。

由于其公开,现在用于数字与字符的转换。

查看ASCII表可以去官网查查。

转换代码如下:

static void Main(string[] args)
{
char c = (char)97;
Console.WriteLine(c);//a
Console.ReadKey();
}

大概就是这样了。

再讲另外一个故事,我们在数据传输过程中为什么要求编码格式一致。

这个问题其实也是一个密码学问题。比如说传输方的编码是UTF8,接收方是GBK,那么两者是接收不到正确的消息的。最起码的一点就是UTF-8是汉字是三个字节,GBK汉字是两个字节。

好吧,下面就介绍几种常用的加解密大法吧。

正文

凯撒加解密

凯撒大法是通过移位来加解密,比如说a移动1位就是b了。

代码如下:

public class KaiserDemo
{
//解密
public static string decrytKaiser(string encrytedData, int key)
{
char[] chars = encrytedData.ToCharArray();
StringBuilder sb = new StringBuilder();
foreach (char c in chars)
{
//转换为int
int asciiCode = c;
asciiCode -= key;
char result = (char)asciiCode;
sb.Append(result);
}
return sb.ToString();
}
//加密
public static string encrytKaiser(string orinal,int key)
{
char[] chars = orinal.ToCharArray();
StringBuilder sb = new StringBuilder();
foreach (char c in chars)
{
//转换为int
int asciiCode = c;
asciiCode += key;
char result = (char)asciiCode;
sb.Append(result);
}
return sb.ToString();
}
}

测试:

static void Main(string[] args)
{
string s = "Hello Word";
int key = 5;
var encrytedStr = KaiserDemo.encrytKaiser(s, key);
Console.WriteLine(encrytedStr);
var decrytedStr = KaiserDemo.decrytKaiser(encrytedStr, key);
Console.WriteLine(decrytedStr);
Console.ReadKey();
}

效果:

base64位转换

base64位是一个非常关键地方,先写一下原理:

base64 是 3个字节为一组,一个字节 8位,一共 就是24位 ,然后,把3个字节转成4组,每组6位,

3 * 8 = 4 * 6 = 24 ,每组6位,缺少的2位,会在高位进行补0 ,这样做的好处在于 ,base取的是后面6位,去掉高2位 ,

那么base64的取值就可以控制在0-63位了,所以就叫base64,111 111 = 32 + 16 + 8 + 4 + 2 + 1 =63

在64范围之内,当然也有人认为0-63,一共64位。

base64 构成原则

① 小写 a - z = 26个字母

② 大写 A - Z = 26个字母

③ 数字 0 - 9 = 10 个数字

④ + / = 2个符号

前面提及到为什么base64是一个非常关键的地方呢?

因为base64可以将一些特殊字符全部转换成常规字符,原来的4个字节变成3个字节,那么数值是变小的。

具体可看一下:

https://baike.baidu.com/item/base64/8545775?fr=aladdin

des 加解密

直接上代码:

/// <summary>
/// DES 加解密
/// </summary>
/// <param name="origal">加解密字符串</param>
/// <param name="key">key</param>
/// <param name="iv">iv</param>
/// <param name="sign">标识加密或者解密位,默认加密</param>
/// <returns>加解密后的结果</returns>
public static string DES(string origal, string key, string iv, int sign = 0)
{
byte[] origalByteArray = sign == 0 ? Encoding.Default.GetBytes(origal) : Convert.FromBase64String(origal);
DESCryptoServiceProvider des = new DESCryptoServiceProvider();
des.Key = Encoding.ASCII.GetBytes(key);
des.IV = Encoding.ASCII.GetBytes(iv);
if (sign != 0)
{
des.Padding = PaddingMode.None;
}
string result = string.Empty;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, sign == 0 ? des.CreateEncryptor() : des.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(origalByteArray, 0, origalByteArray.Length);
cs.FlushFinalBlock();
result = sign == 0 ? Convert.ToBase64String(ms.ToArray()) : System.Text.Encoding.Default.GetString(ms.ToArray()); }
}
if (result == string.Empty)
{
throw new ArgumentException();
}
return result;
}

测试:

static void Main(string[] args)
{
string origal = "王胖子";
string key = "12345678";
string iv = "12345678";
string encrytedStr = DESDemo.DES(origal, key, iv);
Console.WriteLine("加密后的字符串:" + encrytedStr);
string dncrytedStr = DESDemo.DES(encrytedStr, key, iv, 1);
Console.WriteLine("加密后的字符串:" + dncrytedStr);
Console.Read();
}

测试结果:

这里有人看到心里就想啊,怎么跟我代码里面的helper类不一样?

一个是现在不完善,第二个是现在是无填充模式,下一章将会介绍填充模式。

aes

/// <summary>
/// AES 加解密
/// </summary>
/// <param name="origal">加解密字符串</param>
/// <param name="key">key</param>
/// <param name="iv">iv</param>
/// <param name="sign">标识加密或者解密位,默认加密</param>
/// <returns>加解密后的结果</returns>
public static string AES(string origal, string key, string iv, int sign = 0)
{
byte[] origalByteArray = sign == 0 ? Encoding.Default.GetBytes(origal) : Convert.FromBase64String(origal);
RijndaelManaged aes = new RijndaelManaged();
aes.Key = Encoding.ASCII.GetBytes(key);
aes.IV = Encoding.ASCII.GetBytes(iv);
if (sign != 0)
{
aes.Padding = PaddingMode.None;
}
string result = string.Empty;
using (MemoryStream ms = new MemoryStream())
{
using (CryptoStream cs = new CryptoStream(ms, sign == 0 ? aes.CreateEncryptor() : aes.CreateDecryptor(), CryptoStreamMode.Write))
{
cs.Write(origalByteArray, 0, origalByteArray.Length);
cs.FlushFinalBlock();
result = sign == 0 ? Convert.ToBase64String(ms.ToArray()) : System.Text.Encoding.Default.GetString(ms.ToArray()); }
}
if (result == string.Empty)
{
throw new ArgumentException();
}
return result;
}
string origal = "王胖子";
string key = "IE7XG5ORF7EA4JC5";
string iv = "IE7XG5ORF7EA4JC5";
string encrytedStr = AESDemo.AES(origal, key, iv);
Console.WriteLine("加密后的字符串:" + encrytedStr);
string dncrytedStr = AESDemo.AES(encrytedStr, key, iv, 1);
Console.WriteLine("加密后的字符串:" + dncrytedStr);
Console.Read();

测试结果:

和des一样哈,不完善,下一节将会完善。

下一节介绍填充和不填充,如果不明白在开发中还是很容易出事的,比如说服务端采用填充模式,客户端非填充模式,那么会报错的,顺便完善的一下code。

最新文章

  1. swfit-学习笔记(表UITableView的简单使用)
  2. 团队博客作业- Week3
  3. 盘点JavaScript里好用的原生API
  4. 二级c程序设计题(1)
  5. flasCC技术点记录
  6. EF——继承映射关系TPH、TPT和TPC的讲解以及一些具体的例子 05 (转)
  7. 发布 windows 10 universal app 时微软账号验证失败
  8. CSS content内容生成技术以及应用(转)
  9. java内存分块
  10. laravel学习前期遇到的小知识点(1)
  11. Effective Java 电子书 apk版本下载
  12. Oracle 数据库启用归档
  13. css3兼容360
  14. Error occurred during initialization of VM Incompatible initial and maximum heap sizes specified
  15. Eclipse中启动Tomcat报错:[There is insufficient memory for the Java Runtime Environment to continue.]的解决方案
  16. k3生成解决方案时错误处理
  17. Python开发——16.HTML
  18. Graham 扫描法找凸包(convexHull)
  19. laravel 更新
  20. 【Zuul】Zuul过滤器参考资料

热门文章

  1. FileBeat yml配置文件 -常用参数详解
  2. java学习第六天2020/7/11
  3. java 数据结构(九):Collection子接口:List接口
  4. 最短路——Floyd算法
  5. 「美团面试系列」面试加分项,这样说你会JVM,面试官还能问什么
  6. 【Docker】Redis 安装使用教程
  7. 03 AMD规范的基础使用详解
  8. P3756 [CQOI2017]老C的方块
  9. SpringBoot + Spring Cloud Eureka 服务注册与发现
  10. 为什么学习vue?