C# 之 AES加密源码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

using Exam.EncryptPrivate;

using System.Text;
using System.Security.Cryptography;

/// <summary>
/// Aes加密、解密,密钥长度256,密钥长度不大于32个字节
/// </summary>
public class AesCryptoHelper
{
    public const string RET_ERROR = "x07x07x07x07x07";
    private const string CRYPTO_IV = "XIANJIAN";
    private const string CRYPTO_KEY = "XIANJIAN";
    private const int CRYPTO_KEY_LENGTH = 32;
    private const int CRYPTO_IV_LENGTH = 16;

    private AesCryptoServiceProvider m_aesCryptoServiceProvider;
    private string m_message;
    public string Message
    {
        get { return m_message; }
        set { m_message = value; }
    }

    private bool m_containKey;

    /// <summary>
    /// True:密文中包含密钥
    /// False:密文中不包含密钥
    /// </summary>
    public bool ContainKey
    {
        get { return m_containKey; }
        set { m_containKey = value; }
    }

    public AesCryptoHelper()
    {
        m_aesCryptoServiceProvider = new AesCryptoServiceProvider();
        m_containKey = true;
        m_message = string.Empty;
    }

    public AesCryptoHelper(bool containKey):this()
    {
        m_containKey = containKey;
    }

    private string Encrypt(string s_crypto, byte[] key, byte[] iv)
    {
        string s_encryped = string.Empty;
        byte[] crypto, encrypted;
        ICryptoTransform ct;

        try
        {
            crypto = string2Byte(s_crypto);
            m_aesCryptoServiceProvider.Key = key;
            m_aesCryptoServiceProvider.IV = iv;
            ct = m_aesCryptoServiceProvider.CreateEncryptor();
            encrypted = ct.TransformFinalBlock(crypto, 0, crypto.Length);

            if (m_containKey)
            {
                s_encryped += byte2HexString(key);
            }

            s_encryped += byte2HexString(encrypted);
            return s_encryped;
        }

        catch (Exception ex)
        {
            m_message = ex.ToString();
            return RET_ERROR;
        }
    }

    /// <summary>
    /// 指定密钥对明文进行AES加密
    /// </summary>
    /// <param name="s_crypto">明文</param>
    /// <param name="s_key">加密密钥</param>
    /// <returns></returns>
    public string Encrypt(string s_crypto, string s_key)
    {
        byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
        byte[] temp = string2Byte(s_key);

        if (temp.Length > key.Length)
        {
            m_message = "Key too long,need less than 32 Bytes key.";
            return RET_ERROR;
        }

        key = string2Byte(s_key.PadRight(key.Length));
        iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
        return Encrypt(s_crypto, key, iv);
    }

    /// <summary>
    /// 动态生成密钥,并对明文进行AES加密
    /// </summary>
    /// <param name="s_crypto">明文</param>
    /// <returns></returns>
    public string Encrypt(string s_crypto)
    {
        byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
        m_aesCryptoServiceProvider.GenerateKey();
        key = m_aesCryptoServiceProvider.Key;
        iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
        return Encrypt(s_crypto, key, iv);
    }

    private string Decrypt(string s_encrypted, byte[] key, byte[] iv)
    {
        string s_decrypted = string.Empty;
        byte[] encrypted, decrypted;
        ICryptoTransform ct;
        try
        {
            encrypted = hexString2Byte(s_encrypted);
            m_aesCryptoServiceProvider.Key = key;
            m_aesCryptoServiceProvider.IV = iv;
            ct = m_aesCryptoServiceProvider.CreateDecryptor();
            decrypted = ct.TransformFinalBlock(encrypted, 0, encrypted.Length);
            s_decrypted += byte2String(decrypted);
            return s_decrypted;
        }
        catch (Exception ex)
        {
            m_message = ex.ToString();
            m_message = "Decrypt fail.";
            return RET_ERROR;
        }
    }

    /// <summary>
    /// 从密文中解析出密钥,并对密文进行解密
    /// </summary>
    /// <param name="s_encrypted">密文</param>
    /// <returns></returns>
    public string Decrypt(string s_encrypted)
    {
        string s_key = string.Empty;
        byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
        if (s_encrypted.Length <= CRYPTO_KEY_LENGTH * 2)
        {
            m_message = "Encrypted string invalid.";
            return RET_ERROR;
        }

        if (m_containKey)
        {
            s_key = s_encrypted.Substring(0, CRYPTO_KEY_LENGTH * 2);
            s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * 2);
        }

        key = hexString2Byte(s_key);
        iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
        return Decrypt(s_encrypted, key, iv);
    }

    /// <summary>
    /// 指定密钥,并对密文进行解密
    /// </summary>
    /// <param name="s_encrypted">密文</param>
    /// <param name="s_key">密钥</param>
    /// <returns></returns>
    public string Decrypt(string s_encrypted, string s_key)
    {
        byte[] key = new byte[CRYPTO_KEY_LENGTH], iv = new byte[CRYPTO_IV_LENGTH];
        byte[] temp = string2Byte(s_key);
        if (temp.Length > key.Length)
        {
            m_message = "Key invalid.too long,need less than 32 Bytes";
            return RET_ERROR;
        }

        key = string2Byte(s_key.PadRight(key.Length));
        iv = string2Byte(CRYPTO_IV.PadRight(iv.Length));
        if (m_containKey)
        {
            s_encrypted = s_encrypted.Substring(CRYPTO_KEY_LENGTH * 2);
        }

        return Decrypt(s_encrypted, key, iv);
    }

    private string byte2HexString(byte[] bytes)
    {
        StringBuilder sb = new StringBuilder();
        foreach (byte b in bytes)
        {
            sb.AppendFormat("{0:X2}", b);
        }

        return sb.ToString();
    }

    private byte[] hexString2Byte(string hex)
    {
        int len = hex.Length / 2;
        byte[] bytes = new byte[len];

        for (int i = 0; i < len; i++)
        {
            bytes[i] = (byte)(Convert.ToInt32(hex.Substring(i * 2, 2), 16));
        }
        return bytes;
    }

    private byte[] string2Byte(string str)
    {
        return Encoding.UTF8.GetBytes(str);
    }

    private string byte2String(byte[] bytes)
    {
        return Encoding.UTF8.GetString(bytes);
    }
} 
时间: 2024-10-07 01:43:42

C# 之 AES加密源码的相关文章

(转)3DES、AES、RC6、TEA、RSA、MD5、SHA1、SHA256加密源码大聚齐

原贴地址:http://www.amobbs.com/thread-5466438-1-1.html DES---研究过加密的朋友十分熟悉,老牌的加密方法了.这是一个可逆的对称加密算 法,也是应用最广泛的密钥系统.好像是从1977年美国政府开始采用的.大家都看过U-571吧,DES的思路就是参照二战时期盟军缴获的德军恩格玛加密 机,不过DES比那个要NB的多多了.到现在为止,除了差分分析法和线性分析法外只有暴力穷举法了.前两种方法不是密码学家或数学家都不懂呵,不过穷举 DES,以现有我们大家都可

net reactor加密源码保软件安全-net reactor使用教程

上一次介绍用 Xenocode Postbuild for .NET 混淆加密源代码确保软件安全,本篇将讨论用 Eziriz .NET Reactor 混淆加密软件源代码,为从未用过该软件加密的用户分享net reactor使用方法,也就是平常说的net reactor使用教程. 还是那句话,用工具加密不能绝对确保软件安全,却能阻大多数人破解出软件的源代码,在一定程序上确保软件安全. Eziriz .NET Reactor 的主要功能包括:NecroBit IL(转为非托管代码).反 ILDAS

PYTHON实现DES加密源码

要求是实现DES加密,解密,我是用python实现的,还是有挺多坑的,改bug就改了挺久,加密实现后,解密过程就比较轻松. 要求:输入秘钥为64位二进制数(有效位为56位,其中每八位最后一位为奇偶校验位),明文为64位二进制数,输出为64位二进制数,解密过程大致为逆向过程 代码如下: # -*- coding: utf-8 -*- import time import base64 C0='' D0='' L0='' R0='' cipher='' outtext='' substitute1=

Java Base64加密源码

如下的内容段是关于Java Base64加密的内容,应该能对大伙有些用. import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.InputStream;import java.io.OutputStream; import javax.mail.internet.MimeUtility; public class Base64 {public static byte[] en

Python基础教程3——教你用Python做个简单的加密程序(还基础什么呀,直接来练习吧,带源码)

因为发现基础教程我之前推荐的那个网站就已经很完善了,就不重复写了,所以本汪来一起做练习吧. 一.加密原理 记得当时我学c++的时候,学到输入输出流的时候,当时王老师就教我们写了一个小的加密程序,所以这次既然学习了Python这个小练习当然不能放过(其实这个加密程序我用c++,java都写过可以说也算比较熟了).加密原理就是循环读取文件每个字节,然后进行相应的加密运算后就是加密操作了,解密时候进行逆运算就是解密操作了. 比如我们读取文件的第一个字节数据是20(读取出来的每位数据为0~255,因为8

项目源代码被好朋友“盗用”!让我痛心疾首!给Python源码加密!

在加速发展的今天,互联网是一把双刃剑,既可以让软件行业高速发展,也能让它变成到处可见的免费资源.一个软件企业想要高速发展,技术很重要,安全也相当重要,它们同时存在才能保证软件的知识产权不受侵害,实现商业价值.今天我们就讲一讲用 Python 语言开发的软件如何加密源码以及加密前后的效果对比. 进群:125240963  即可获取数十套PDF哦! 安全技术 ? 虚拟机外壳:精锐5的外壳保护工具,创新性的引入了预分析和自动优化引擎,有效的解决了虚拟化保护代码时的安全性和性能平衡问题. 加密之前 以

php AES加密 对应Java SHA1PRNG方式加密

做对接的时候,服务商做的AES加密通过SHA1PRNG算法(只要password一样,每次生成的数组都是一样的,所以可以用来做加密解密的key)进行了又一次加密,搞了好几个小时,直接看对应的代码吧,可以参考一下,只有Java的加密源码 private static byte[] encrypt(byte[] byteContent, byte[] password) throws Exception { KeyGenerator kgen = KeyGenerator.getInstance("

JAVA上百实例源码以及开源项目

简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬.向往!此时此景,笔者只专注Android.Iphone等移动平台开发,看着这些源码心中有万分感慨,写此文章纪念那时那景! Java 源码包 Applet钢琴模拟程序java源码 2个目标文件,提供基本的音乐编辑功能.编辑音乐软件的朋友,这款实例会对你有所帮助.Calendar万年历 1个目标文件EJ

网狐棋牌源码搭建问题难点棋牌平台搭建下载教程

网狐框架虽然功能复杂繁多,但总体框架还是很清晰的.服务器端主要包裹: 1.登录服务器 唯一一个,启动时需要连接中心服务器.中转玩家的消息,相当于别的游戏服务器的gate. 2.中心服务器 全局服务器,登陆服务器和加载服务器都需要连接它. 3.加载服务器 游戏逻辑功能服务器,通过dll加载的方式加载具体游戏,每个游戏就是一个dll.它还调用另一个dll:游戏服务.该dll负责所有游戏统一都有的功能,例如桌子座位管理等. 内核引擎,看了下源代码,代码量还是很大的,采用了windows完成端口,soc