文档章节

C# 一个简易的加密、解密字符串工具类

北风其凉
 北风其凉
发布于 2014/08/14 21:06
字数 590
阅读 262
收藏 0

本文实现的类CypherHelper是一个用于加密、解密字符串的工具类~~~,适合于方便地加密、解密长度较短的密码等字符串(C#里面已经有了库System.Security.Cryptography,对于比较长的字符串或流来说是一个更好的选择)

类CypherHelper代码:

class CypherHelper
{
    /// <summary>
    /// 加密字符串
    /// </summary>
    /// <param name="word">被加密字符串</param>
    /// <param name="key">密钥</param>
    /// <returns>加密后字符串</returns>
    public static string Encrypt(string word, string key)
    {
        if (!System.Text.RegularExpressions.Regex.IsMatch(key, "^[a-zA-Z]*$"))
        {
            throw new Exception("key 必须由字母组成");
        }

        key = key.ToLower();

        //逐个字符加密字符串
        char[] s = word.ToCharArray();
        for (int i = 0; i < s.Length; i++)
        {
            char a = word[i];
            char b = key[i % key.Length];
            s[i] = EncryptChar(a, b);
        }

        return new string(s);
    }

    /// <summary>
    /// 加密单个字符
    /// </summary>
    /// <param name="a">被加密字符</param>
    /// <param name="b">密钥</param>
    /// <returns>加密后字符</returns>
    private static char EncryptChar(char a, char b)
    {
        int c = a + b - 'a';

        if (a >= '0' && a <= '9') //字符0-9的转换
        {
            while (c > '9') c -= 10;
        }
        else if (a >= 'a' && a <= 'z') //字符a-z的转换
        {
            while (c > 'z') c -= 26;
        }
        else if (a >= 'A' && a <= 'Z') //字符A-Z的转换
        {
            while (c > 'Z') c -= 26;
        }
        else return a; //不再上面的范围内,不转换直接返回

        return (char)c; //返回转换后的字符
    }

    /// <summary>
    /// 解密字符串
    /// </summary>
    /// <param name="word">被解密字符串</param>
    /// <param name="key">密钥</param>
    /// <returns>解密后字符串</returns>
    public static string Decrypt(string word, string key)
    {
        if (!System.Text.RegularExpressions.Regex.IsMatch(key, "^[a-zA-Z]*$"))
        {
            throw new Exception("key 必须由字母组成");
        }

        key = key.ToLower();

        //逐个字符解密字符串
        char[] s = word.ToCharArray();
        for (int i = 0; i < s.Length; i++)
        {
            char a = word[i];
            char b = key[i % key.Length];
            s[i] = DecryptChar(a, b);
        }

        return new string(s);
    }

    /// <summary>
    /// 解密单个字符
    /// </summary>
    /// <param name="a">被解密字符</param>
    /// <param name="b">密钥</param>
    /// <returns>解密后字符</returns>
    private static char DecryptChar(char a, char b)
    {
        int c = a - b + 'a';

        if (a >= '0' && a <= '9') //字符0-9的转换
        {
            while (c < '0') c += 10;
        }
        else if (a >= 'a' && a <= 'z') //字符a-z的转换
        {
            while (c < 'a') c += 26;
        }
        else if (a >= 'A' && a <= 'Z') //字符A-Z的转换
        {
            while (c < 'A') c += 26;
        }
        else return a; //不再上面的范围内,不转换直接返回

        return (char)c; //返回转换后的字符
    }
}

Main函数调用示例

class Program
{
    static void Main(string[] args)
    {
        //1.加密
        string a = CypherHelper.Encrypt("TsybiusLee1234", "Galatea");
        Console.WriteLine("加密:TsybiusLee1234 → " + a);

        //2.解密
        string b = CypherHelper.Decrypt(a, "Galatea");
        Console.WriteLine("解密:" + a + " → " + b);

        Console.ReadLine();
    }
}

运行结果

END

© 著作权归作者所有

北风其凉

北风其凉

粉丝 120
博文 497
码字总数 462305
作品 4
朝阳
程序员
私信 提问
C#实现网络传输数据加密

分组密码 分组密码是将明文消息编码表示后数字序列划分成长为n的分组,各组分别在密钥的作用下进行变换输出等长的数字序列,即密文。一次加密一个数据组,加解密所使用的是同一密钥,故其通常...

鱼煎
2016/06/25
50
0
Asp.NET的DES&AES加密算法(转载)

Asp.Net C#中除了MD5加密之外还经常用到了AES加密、解密与DES加密、解密,本次先介绍DES的加密及解密。注意的是DES的密匙是8位的。 private static readonly String strDesKey = "imaoblog";...

maoxiajun
2011/08/02
802
0
整合一个基于c#的RSA私钥加密公钥解密的Helper类

转自:http://www.cnblogs.com/yyl8781697/archive/2013/04/28/RSA.html 最近在搞单点登录的设计,在设计中需要一个Token令牌的加密传输,这个令牌在整个连接单点的各个站中起着连接认证作用,...

andrewniu
2018/05/11
0
0
厚积薄发,丰富的公用类库积累,助你高效进行系统开发(8)----非对称加密、BASE64加密、MD5等常用加密处理

俗话说,一个好汉十个帮,众人拾柴火焰高等都说明一个道理,有更多的资源,更丰富的积累,都是助你走向成功,走向顶峰的推动力。 本篇继续继续整理优化已有的共用类库,并继续发表随笔介绍公...

长平狐
2012/06/11
202
0
从某恶意软件Dropper样本,探寻分析.NET恶意软件的方法

      概述   作为安全专家,我们更喜欢对新型恶意软件进行分析。每当有安全团队发布新型攻击分析报告时,我们都会第一时间阅读。从这些报告中,我们发现了一个规律,即使是能力最强的...

嘶吼RoarTalk
2018/09/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

PostgreSQL 11.3 locking

rudi
今天
5
0
Mybatis Plus sql注入器

一、继承AbstractMethod /** * @author beth * @data 2019-10-23 20:39 */public class DeleteAllMethod extends AbstractMethod { @Override public MappedStatement injectMap......

一个yuanbeth
今天
10
1
一次写shell脚本的经历记录——特殊字符惹的祸

本文首发于微信公众号“我的小碗汤”,扫码文末二维码即可关注,欢迎一起交流! redis在容器化的过程中,涉及到纵向扩pod实例cpu、内存以及redis实例的maxmemory值,statefulset管理的pod需要...

码农实战
今天
4
0
为什么阿里巴巴Java开发手册中不建议在循环体中使用+进行字符串拼接?

之前在阅读《阿里巴巴Java开发手册》时,发现有一条是关于循环体中字符串拼接的建议,具体内容如下: 那么我们首先来用例子来看看在循环体中用 + 或者用 StringBuilder 进行字符串拼接的效率...

武培轩
今天
8
0
队列-链式(c/c++实现)

队列是在线性表功能稍作修改形成的,在生活中排队是不能插队的吧,先排队先得到对待,慢来得排在最后面,这样来就形成了”先进先出“的队列。作用就是通过伟大的程序员来实现算法解决现实生活...

白客C
今天
81
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部