Внедрение AES-CFB между CSharp и Golang - PullRequest
0 голосов
/ 13 октября 2018

Я не могу расшифровать строку, зашифрованную с помощью CSharp, используя Golang, потому что я думаю, что CSharp использует CFB8 и Golang CFB128 (размер обратной связи).Но если я использую CSharp с FeedbackSize = 128, тогда мне нужно использовать Padding, в результате он будет у меня также в зашифрованном тексте (которого нет у Golang), наоборот, я не могу использовать FeedbackSize = 8 в Golang, потому что он не реализован,

Есть идеи?

CSharp код:

static void Main(string[] args)
    {
        byte[] msg = Encoding.UTF8.GetBytes("Message to encrypt");
        byte[] k = Encoding.UTF8.GetBytes("0123456789abcdef");
        byte[] iv = Encoding.UTF8.GetBytes("0123456789abcdef");
        using (RijndaelManaged Aes128 = new RijndaelManaged())
        {
            Aes128.BlockSize = 128;
            Aes128.KeySize = 128;
            Aes128.Mode = CipherMode.CFB;
            Aes128.FeedbackSize = 8;
            Aes128.Padding = PaddingMode.Zeros;
            Aes128.Key = k;
            Aes128.IV = iv;

            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(msg);
                bw.Close();
                msg = msEncrypt.ToArray();
                Console.WriteLine("Encrypted " + BitConverter.ToString(msg));
            }
        }
    }

Результат:

Encrypted 3F-D6-AD-8E-D5-34-E6-2D-38-7B-38-4E-DE-72-E8-B1-42-1C

Код Голанга:

    package main
import (
    "crypto/aes"
    "crypto/cipher"
    "fmt"
)
func main() {
    msg := []byte("Message to encrypt")
    k := []byte("0123456789abcdef")
    iv := []byte("0123456789abcdef")
    {
        block, _ := aes.NewCipher(k)
        stream := cipher.NewCFBEncrypter(block, iv)
        stream.XORKeyStream(msg, msg)
        fmt.Printf("Encrypted %x\n", msg)
    }
}

Результат:

Encrypted 3f170dfb7fbb982174c8380d176ac71c89ac

Примечание: если я перехожу на Aes128.FeedbackSize = 128, я получаю ошибку, потому что я не использую заполнение, если я использую заполнение, я получаю следующий результат:

Encrypted 3F-17-0D-FB-7F-BB-98-21-74-C8-38-0D-17-6A-C7-1C-89-AC-F2-4F-9A-1D-E8-0B-D4-40-21-60-AF-48-36-5F

Большое спасибо заранее.

1 Ответ

0 голосов
/ 13 октября 2018

CFB не должен требовать заполнения, но вы всегда можете реализовать его в GoLang, чтобы обойти глупость реализации RijndaelManaged.Просто примените отступ перед шифрованием и распаковку после расшифровки.Библиотека .NET по умолчанию использует заполнение PKCS # 7.

...