C# 托管SIMPLEBLOB blob不';不匹配非托管SIMPLEBLOB(RSA-加密)

C# 托管SIMPLEBLOB blob不';不匹配非托管SIMPLEBLOB(RSA-加密),c#,cryptography,rsa,C#,Cryptography,Rsa,使用生成的简单blob CryptExportKey(hKey, hPublicKey, SIMPLEBLOB, 0, lpData, &nSize); 与以下代码生成的值不匹配(请注意,client.key是使用找到的hKey的纯文本键值) 为什么呢 我的计算机中的代码不正确。您必须反转加密的字节。我已经更新了答案来解决这个问题 上面的代码缺少一个“w.Write((字节)0x00);//Reserved”。我最初的回答重复了那句话,这不是一个错误 RSA PKCS#1加密(在SIM

使用生成的简单blob

CryptExportKey(hKey, hPublicKey, SIMPLEBLOB, 0, lpData, &nSize);
与以下代码生成的值不匹配(请注意,client.key是使用找到的hKey的纯文本键值)

为什么呢

  • 我的计算机中的代码不正确。您必须反转加密的字节。我已经更新了答案来解决这个问题

  • 上面的代码缺少一个“
    w.Write((字节)0x00);//Reserved
    ”。我最初的回答重复了那句话,这不是一个错误

  • RSA PKCS#1加密(在SIMPLEBLOB中使用)是不确定的。也就是说,对同一数据加密两次不会得到相同的结果

  • 综上所述:将上述代码更改为:

    public byte[] GetRC4SessionBlobFromKey(byte[] keyData, RSACryptoServiceProvider publicKey)        
    {              
      using(MemoryStream ms = new MemoryStream())              
      using(BinaryWriter w = new BinaryWriter(ms))            
      {                   
        w.Write((byte) 0x01); // SIMPLEBLOB                    
        w.Write((byte) 0x02); // Version 2                    
        w.Write((byte) 0x00); // Reserved                    
        w.Write((byte) 0x00); // Reserved                    
        w.Write(0x00006801);  // ALG_ID = RC4 for the encrypted key.                
        w.Write(0x0000a400);  // CALG_RSA_KEYX                    
        byte[] encryptedKey = publicKey.Encrypt(key.Key);
        byte[] reversedEncryptedKey = new byte[encryptedKey.Length];
        for(int i=0;i<encryptedKey.Length;i++){
          reversedEncryptedKey[i] = encryptedKey[encryptedKey.Length - 1 - i];
        }
        w.Write(reversedEncryptedKey); // encrypted key in LSB byte order
    
        w.Flush();                
    
        return ms.ToArray();              
      }        
    }
    
    public byte[]GetRC4SessionBlobFromKey(byte[]keyData,RSACryptServiceProvider公钥)
    {              
    使用(MemoryStream ms=new MemoryStream())
    使用(BinaryWriter w=新的BinaryWriter(ms))
    {                   
    w、 写入((字节)0x01);//SIMPLEBLOB
    w、 写入((字节)0x02);//版本2
    w、 写入((字节)0x00);//保留
    w、 写入((字节)0x00);//保留
    w、 写入(0x00006801);//加密密钥的ALG_ID=RC4。
    w、 写入(0x0000a400);//计算RSA密钥
    字节[]encryptedKey=publicKey.Encrypt(key.key);
    byte[]reversedEncryptedKey=新字节[encryptedKey.Length];
    
    对于(int i=0;i我无法编辑我自己的问题,因此我将您希望我附加的内容放在这个答案中,我有下面visual studio中二进制编辑器/即时窗口中图像的屏幕截图

    CryptExportKey-SIMPLEBLOB

    调试窗口中的KeyMaterial值

    使用代码项目文章保存在文件中的关键材质值

    GetRC4SessionBlobFromKey()中的会话键值(由逗号分隔的单个字节的整数值)


    非常感谢您对此进行调查,请告诉我是否还有其他信息可以提供。

    您的意思是附加或复制实际的SIMPLEBLOB内容吗?我可以这样做。是的,请包括CryptExportKey()-blob和GetRC4SessionBlobFromKey()-blob的内容。(十六进制编码或base64编码或其他编码)。嗨,Rasmus,很抱歉延迟回复,感谢您的回复,我离开了一段时间,直到今天才看到您的评论。评论文本框不允许放置超过300个字符或上载文件。请让我知道是否有其他方法可以与您联系(例如电子邮件)。谢谢最好的选择是编辑您的问题并在那里添加信息。或者将信息添加到您自己的问题的答案中,或者将其拆分为多个注释。如果这两个选项都不起作用,请告诉我。嗨,Rasmus。非常感谢您更新的代码。这成功了,效果非常好。出于好奇ity,为什么是LSB字节顺序?再次非常感谢!!!!!你真的应该在网站上注册。通过使用半匿名配置文件,你会遇到很多问题。尽管如此,我已经编辑了我的答案。希望对你有所帮助。
    public byte[] GetRC4SessionBlobFromKey(byte[] keyData, RSACryptoServiceProvider publicKey)        
    {              
      using(MemoryStream ms = new MemoryStream())              
      using(BinaryWriter w = new BinaryWriter(ms))            
      {                   
        w.Write((byte) 0x01); // SIMPLEBLOB                    
        w.Write((byte) 0x02); // Version 2                    
        w.Write((byte) 0x00); // Reserved                    
        w.Write((byte) 0x00); // Reserved                    
        w.Write(0x00006801);  // ALG_ID = RC4 for the encrypted key.                
        w.Write(0x0000a400);  // CALG_RSA_KEYX                    
        byte[] encryptedKey = publicKey.Encrypt(key.Key);
        byte[] reversedEncryptedKey = new byte[encryptedKey.Length];
        for(int i=0;i<encryptedKey.Length;i++){
          reversedEncryptedKey[i] = encryptedKey[encryptedKey.Length - 1 - i];
        }
        w.Write(reversedEncryptedKey); // encrypted key in LSB byte order
    
        w.Flush();                
    
        return ms.ToArray();              
      }        
    }