C# 中使用不安全代码与指针进行字符串加密解密

桃夭
桃夭
发布时间:2026-10-14 | 4人浏览过
原创

本文演示了如何在 C# 中通过不安全代码块(unsafe block)和指针操作对字符串进行简单的异或加密与解密。核心逻辑是将字符串固定到字符数组,将指针传递给专用处理函数,利用按位异或(XOR)特性实现加解密的对称性。

C# 指针加密解密原理

在常规 C# 开发中,指针访问是不被允许的,但通过启用 unsafe 模式,开发者可以直接操作内存地址。本实例展示了一个经典的对称加密小Demo:同一个处理函数,执行一次为加密,再次执行即为解密。这是因为按位异或(XOR)运算具有自反性:A ^ B ^ B = A。

完整代码实现

以下代码完整实现了字符串的初始化、固定、加密、输出、解密及最终输出过程。请注意,代码包含 unsafe 上下文,编译时需允许不安全代码。

using System;

namespace PointerDemo
{
    public class PointerDemo
    {
        public static void Main()
        {
            string s = "Hello Csharp!"; // 原字符串
            Console.Write("the original string: ");
            Console.WriteLine("{0}\r\n", s);

            char[] b = new char[100];
            // 将字符串内容复制到字符数组
            s.CopyTo(0, b, 0, 13);

            Console.Write("the encoded string: ");
            // 使用不安全代码
            unsafe
            {
                // 加密过程:固定字符数组指针,并传给加密函数
                fixed (char* p = b) NEncodeDecode(p);
            }

            // 打印加密后的字符串
            for (int i = 0; i < 13; i++)
                Console.Write(b[i]);
            Console.WriteLine("\r\n");

            Console.Write("the decoded string: ");
            unsafe
            {
                // 解密过程:再次传入指针,函数内部再次异或5,恢复原值
                fixed (char* p = b) NEncodeDecode(p);
            }

            // 打印解密后的字符串
            for (int i = 0; i < 20; i++)
                Console.Write(b[i]);

            // 额外的异或示例:2 ^ 5 = 7
            int t = 2;
            t = t ^ 5;
            Console.WriteLine(t);
            Console.WriteLine();
        }

        // 对给定字符串指针进行加密/解密处理
        unsafe public static void NEncodeDecode(char* s)
        {
            int w;
            // 遍历前13个字符进行处理
            for (int y = 0; y < 13; y++)
            {
                // 读取当前字符对应的ASCII码值
                w = (int)*(s + y);
                // 执行异或运算(加密密钥为5)
                w = w ^ 5;
                // 写回修改后的字符
                *(s + y) = (char)w;
            }
        }
    }
}

关键步骤解析

第1步:准备安全环境

在 Main 方法中,首先创建一个足够大的字符数组 b 以存储字符串数据。由于后续需要使用指针,必须在 unsafe 块中使用 fixed 语句将托管对象(数组 b)固定在内存中,防止垃圾回收器移动其地址。这是使用指针的前提条件。

第2步:执行加密操作

通过 fixed (char* p = b) 获取指向数组起始位置的指针 p,并将其作为参数传递给 NEncodeDecode(p)。函数内部通过指针算术 (s + y) 遍历每个字符,将其 ASCII 值与 5 进行异或运算后写回内存。此时,数组 b 中的内容变为乱码(密文)。

第3步:执行解密操作

解密过程无需新算法。再次进入 unsafe 块,固定同样的指针并调用 NEncodeDecode(p)。由于 (A ^ 5) ^ 5 = A,函数第二次作用于密文字符时,会将其还原为原始 ASCII 值,从而实现解密。

第4步:验证结果

通过循环打印字符数组内容,可观察到:第一次打印输出的是加密后的乱码,第二次打印输出的是原始的 Hello Csharp!。此外,末尾代码演示了整数异或 2 ^ 5 = 7,直观展示了 XOR 运算特性。

注意事项与风险

  • 编译设置: 项目属性中必须勾选“允许不安全代码”才能编译此程序。
  • 内存安全: 指针操作绕过了 CLR 的安全检查,若越界访问可能导致程序崩溃,需谨慎使用。
  • 性能权衡: 对于简单的字符串处理,常规数组索引通常更安全可靠且性能差异不大;此例主要用于展示指针机制。

以上就是 C# 中使用 Pointer 指针进行字符串加密和解密的详细内容,更多关于 C# 不安全代码操作及基础算法的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表