c# - CSharp 中的密码代码类似于 Go 中的代码(AES、CFB、XorKeyStream)

标签 c# go cryptography aes

我在 Go 中有加密代码,但我很难在 CSharp 中找到类似的代码。 我正在考虑自己实现 XorKeyStream,但有人告诉我,如果我编写自己的加密代码,就会存在法律问题。我相信 CSharp 中一定有类似的代码。

package main

import (
    "crypto/aes"
    "crypto/cipher"
    "fmt"
)

func main() {

    k1 := []byte("0123456789abcdef")
    r1 := []byte("1234567890abcdef")
    data := []byte("0123456789")
    fmt.Printf("original %x %s\n", data, string(data))

    {
        block, _ := aes.NewCipher(k1)
        stream := cipher.NewCFBEncrypter(block, r1)
        stream.XORKeyStream(data, data)
        fmt.Printf("crypted %x\n", data)
    }
    {
        block, _ := aes.NewCipher(k1)
        stream := cipher.NewCFBDecrypter(block, r1)
        stream.XORKeyStream(data, data)
        fmt.Printf("decrypted %x %s\n", data, string(data))
    }

}

http://play.golang.org/p/EnJ56dYX_-

输出

original 30313233343536373839 0123456789
crypted 762b6dcea9c2a7460db7
decrypted 30313233343536373839 0123456789

附言 有些人将该问题标记为可能重复的问题:“C# AES:加密文件导致“要加密的数据的长度无效。”错误” 我在 CSharp 中寻找与 Go 中现有代码相同的代码。这个问题是关于填充的。该算法需要将异或文本的“ key 流”。 这是不同的问题。

最佳答案

这是你的代码

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

class AES_CFB_XorKeyStream
{
    static void Main(string[] args)
    {
        byte[] data = Encoding.UTF8.GetBytes("0123456789");
        byte [] k1 = Encoding.UTF8.GetBytes("0123456789abcdef");
        byte [] r1 = Encoding.UTF8.GetBytes("1234567890abcdef");

        Console.WriteLine("original " + BitConverter.ToString(data));

        using (RijndaelManaged Aes128 = new RijndaelManaged())
        {
            Aes128.BlockSize = 128;
            Aes128.KeySize = 128;
            Aes128.Mode = CipherMode.CFB;
            Aes128.FeedbackSize = 128;
            Aes128.Padding = PaddingMode.None;
            Aes128.Key = k1;
            Aes128.IV = r1;

            using (var encryptor = Aes128.CreateEncryptor())
            using (var msEncrypt = new MemoryStream())
            using (var csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            using (var bw = new BinaryWriter(csEncrypt, Encoding.UTF8))
            {
                bw.Write(data);
                bw.Close();

                data = msEncrypt.ToArray();
                Console.WriteLine("crypted " + BitConverter.ToString(data));
            }
        }

        using (RijndaelManaged Aes128 = new RijndaelManaged())
        {
            Aes128.BlockSize = 128;
            Aes128.KeySize = 128;
            Aes128.Mode = CipherMode.CFB;
            Aes128.FeedbackSize = 128;
            Aes128.Padding = PaddingMode.None;

            Aes128.Key = k1;
            Aes128.IV = r1;

            using (var decryptor = Aes128.CreateDecryptor())
            using (var msEncrypt = new MemoryStream())
            using (var csEncrypt = new CryptoStream(msEncrypt, decryptor, CryptoStreamMode.Write))
            using (var bw = new BinaryWriter(csEncrypt, Encoding.UTF8))
            {
                bw.Write(data);
                bw.Close();

                data = msEncrypt.ToArray();
                Console.WriteLine("decrypted " + BitConverter.ToString(data));
            }
        }
    }
}

输出

original 30-31-32-33-34-35-36-37-38-39
crypted 76-2B-6D-CE-A9-C2-A7-46-0D-B7
decrypted 30-31-32-33-34-35-36-37-38-39

关于c# - CSharp 中的密码代码类似于 Go 中的代码(AES、CFB、XorKeyStream),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35658196/

相关文章:

c# - 如何检查方法是否具有属性(使用接口(interface)、转换和抽象)

c# - Azure 认知服务 - 为什么我无权访问服务? (401错误)

c# - 如何使用 LINQ 用数据库中的数据填充列表?

go - 在将float常量转换为int的类型期间,常量被截断为整数错误

python - 在 Python 中加密字符串

在 C 中将大位字符串转换为十六进制

c# - 如何选择扩展组中的第一项( ListView )

dockerfile install go local packages 可以吗?

go - 在 golang 中加入映射键

Java 密码学生成 key 的可移植性