首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >密码API <-> .NET RSA互操作

密码API <-> .NET RSA互操作
EN

Stack Overflow用户
提问于 2009-03-29 01:55:59
回答 1查看 3.2K关注 0票数 0

我有一个非托管应用程序,它使用Crypto生成一个RC4加密密钥。此非托管应用程序使用此RC4密钥加密某些数据。还有一个客户端非托管应用程序使用此RC4密钥对信息进行解密。

但是,对于这个客户端应用程序,我们将发送一个会话密钥-> --使用在客户端生成的RSA公钥(SIMPLEBLOB)进行加密的RC4密钥。加密会话密钥的生成以前是使用非托管代码完成的,但现在必须转换为C#,因为需要在部分信任的情况下从web应用程序运行此代码。

密钥是使用

代码语言:javascript
运行
复制
CryptGenKey(hProv, CALG_RC4, KEY_LENGTH | CRYPT_EXPORTABLE, &hKey);

将其导出到文件系统中。

代码语言:javascript
运行
复制
CryptExportKey(hKey, 0, OPAQUEKEYBLOB, 0, lpBuffer, &nSize);

(注:我能够使用本文http://www.codeproject.com/KB/security/plaintextsessionkey.aspx导出纯文本键)

客户端公钥是使用

代码语言:javascript
运行
复制
CryptGetUserKey(hProv, AT_KEYEXCHANGE, &hKeyPair);

客户端公钥将使用

代码语言:javascript
运行
复制
CryptExportKey(hKeyPair, 0, PUBLICKEYBLOB, 0, lpData, &nSize);

会话密钥是在服务器端使用

  1. 客户端公钥是使用

&hPublicKey

  • Session (hProv、lpData、nSize、NULL、0、nSize密钥)是通过使用客户端公钥对RC4进行加密以生成SIMPLEBLOB格式来生成的。

CryptExportKey(hKey,hPublicKey,SIMPLEBLOB,0,lpData,&nSize);

现在,我的要求是在托管版本中包含上述步骤(步骤1和步骤2),下面是我正在做的工作:

//读取使用代码项目byte[] keyMaterial =File.ReadAllBytes(@“C:\keyMaterial.txt”)提取的纯文本密钥数据;

//导入客户端公钥

代码语言:javascript
运行
复制
CspParameters cspParams = new CspParameters();
            cspParams.KeyContainerName = "Container Name";
            cspParams.KeyNumber = (int)KeyNumber.Exchange;
            cspParams.ProviderType = 1;
            cspParams.ProviderName = "Microsoft Enhanced Cryptographic Provider v1.0";
            cspParams.Flags = CspProviderFlags.UseMachineKeyStore;

            RSACryptoServiceProvider rsaClient = new RSACryptoServiceProvider(cspParams);   
            rsaClient.ImportCspBlob(File.ReadAllBytes(@"C:\client.key"));

//Generate a SIMPLEBLOB session key
byte[] session = GetRC4SessionBlobFromKey(keyMaterial, rsaClient);



//Encrypt a key using public key and write it in a SIMPLEBLOB format
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    

                w.Write(publicKey.Encrypt(keyData, false));
                w.Flush();

                return ms.ToArray();  
            }
        }

这将生成与其非托管版本相同的数据大小,但它不会生成正确的SIMPLEBLOB会话密钥,就像非托管版本的第一步和第二步一样。我在这代码里做错了什么?

EN

回答 1

Stack Overflow用户

发布于 2010-12-08 14:07:13

我是这里的新手,但我只是在MSDN文档中阅读了以下内容:

与微软密码API ()的互操作

与非托管CAPI中的RSA实现不同,RSACryptoServiceProvider类在加密后和解密之前逆转加密的字节数组的顺序。默认情况下,RSACryptoServiceProvider类加密的数据不能由CAPI函数解密,而由CAPI方法加密的数据不能由RSACryptoServiceProvider类解密。

如果在APIs之间互操作时不补偿反向排序,则RSACryptoServiceProvider类将抛出一个CryptographicException.。

这可能是问题所在吗?

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/693974

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档