douming4359 2018-10-13 10:32
浏览 158

CSharp和Golang之间的AES-CFB实现不一致

I'm not able to decrypt a string encrypted with CSharp using Golang, because I think CSharp uses a CFB8 and Golang CFB128 (Feedback Size). But if I use CSharp with FeedbackSize=128 then I need to use Padding that as a result I will have it also in the encrypted text (that Golang doesn't have), viceversa I cannot use FeedbackSize=8 in Golang because is not implemented.

Any idea?

CSharp code:

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

Result:

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

Golang code:

    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
", msg)
    }
}

Result:

Encrypted 3f170dfb7fbb982174c8380d176ac71c89ac

Note: if I change to Aes128.FeedbackSize = 128, then I got an error because I don't use padding, if I use padding I have the following result:

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

Many thanks in advance.

  • 写回答

1条回答 默认 最新

  • duanke0178 2018-10-13 13:47
    关注

    CFB should not require padding, but you can always implement it in GoLang to get around the stupidity of the RijndaelManaged implementation. Just apply the padding before encryption and the unpadding after decryption. The .NET library uses PKCS#7 padding by default.

    评论

报告相同问题?

悬赏问题

  • ¥15 用hfss做微带贴片阵列天线的时候分析设置有问题
  • ¥50 我撰写的python爬虫爬不了 要爬的网址有反爬机制
  • ¥15 Centos / PETSc / PETGEM
  • ¥15 centos7.9 IPv6端口telnet和端口监控问题
  • ¥120 计算机网络的新校区组网设计
  • ¥20 完全没有学习过GAN,看了CSDN的一篇文章,里面有代码但是完全不知道如何操作
  • ¥15 使用ue5插件narrative时如何切换关卡也保存叙事任务记录
  • ¥20 海浪数据 南海地区海况数据,波浪数据
  • ¥20 软件测试决策法疑问求解答
  • ¥15 win11 23H2删除推荐的项目,支持注册表等