dqzve68846 2016-02-26 17:35
浏览 132
已采纳

CSharp中的密码代码类似于Go(AES,CFB,XorKeyStream)中的代码

I have cryptographic code in Go but I can't hard find similar code in CSharp. I am debating to make my own implementation of XorKeyStream but I am told that there is legal issue if I write my own cryptographic code. I am sure there must be similar code in 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
", data, string(data))

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

}

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

output

original 30313233343536373839 0123456789
crypted 762b6dcea9c2a7460db7
decrypted 30313233343536373839 0123456789

PS Some people marked that question as possible duplicate of question: "C# AES: Encrypt a file causes “Length of the data to encrypt is invalid.” error" I look for identical code in CSharp for existing code in Go. That question is about padding. This algorithm needs "Key stream" that will xor text. It is different questions.

  • 写回答

2条回答 默认 最新

  • dongtu0088 2016-03-03 10:50
    关注

    Here is your code

    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));
                }
            }
        }
    }
    

    output

    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
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?