CryptAPI 与 .NET 代码的本机互操作

2024-02-12

我已成功使用 Crypto API 以本机代码加密数据,并使用 RC2 算法和 SHA 创建密钥,以 .NET (C#) 代码对其进行解密。

这是本机代码(在本例中为 Delphi):

// Get handle to CSP
If Not CryptAcquireContext(hCryptProv, nil, nil, PROV_RSA_FULL, 0) Then
    If Not CryptAcquireContext(hCryptProv, nil, nil, PROV_RSA_FULL, CRYPT_NEWKEYSET) Then
        ShowMessage('CryptAcquireContext '+IntToStr(GetLastError()));

// Create a hash object
If Not CryptCreateHash(hCryptProv, CALG_SHA, 0, 0, hHash) Then
        ShowMessage('CryptCreateHash '+IntToStr(GetLastError()));

// Hash the password
If Not CryptHashData(hHash,PByte(as_password), Length(as_password), 0) Then
        ShowMessage('CryptHashData '+IntToStr(GetLastError()));

// Derive a session key from the hash object
If Not CryptDeriveKey(hCryptProv, CALG_RC2, hHash, CRYPT_EXPORTABLE, hKey) Then
        ShowMessage('CryptDeriveKey '+IntToStr(GetLastError()));

// allocate buffer space
lul_datalen := Length(ablob_data);
lblob_buffer := ablob_data + '        ';
lul_buflen := Length(lblob_buffer);

If ab_encrypt Then
    // Encrypt data
    If CryptEncrypt(hKey, 0, True, 0, PByte(lblob_buffer), lul_datalen, lul_buflen) Then
        lblob_value := Copy(lblob_buffer, 1, lul_datalen)
  else
        ShowMessage('CryptEncrypt '+IntToStr(GetLastError()))
Else
    // Decrypt data
    If CryptDecrypt(hKey, 0, True, 0, PByte(lblob_buffer), lul_datalen) Then
        lblob_value := Copy(lblob_buffer, 1, lul_datalen)
    Else
        ShowMessage('CryptDecrypt '+IntToStr(GetLastError()));

// Destroy session key
If hKey > 0 Then
    CryptDestroyKey(hKey);

// Destroy hash object
If hHash > 0 Then
    CryptDestroyHash(hHash);

// Release CSP handle
If hCryptProv > 0 Then
    CryptReleaseContext(hCryptProv, 0);

  Result := lblob_value;

这是.NET 代码:

CspParameters cspParams = new CspParameters(1);
PasswordDeriveBytes deriveBytes = new PasswordDeriveBytes(aPassword, null, "SHA-1", 1, cspParams);
byte[] rgbIV = new byte[8];
byte[] key = deriveBytes.CryptDeriveKey("RC2", "SHA1", 0, rgbIV);

var provider = new RC2CryptoServiceProvider();
provider.Key = key;
provider.IV = rgbIV;

ICryptoTransform transform = provider.CreateDecryptor();

byte[] decyptedBlob = transform.TransformFinalBlock(arData, 0, arData.Length);

现在我想使用想要使用更新更好的AES加密,所以在本机代码中我想使用PROV_RSA_AES代替PROV_RSA_FULL, CALG_SHA_256代替CALG_SHA and CALG_AES_256代替CALG_RC2。这在本机站点上运行良好。

但我无法让它在 .NET 网站上运行。当然,我需要将 RC2CryptoServiceProvider 更改为 AESCryptoServiceProvider,并且 CspParameters 必须使用 24 而不是 1 进行初始化。我的问题是如何开始使用 PasswordDerivedBytes,所需的确切参数值是多少?

感谢您的任何提示。


None

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

CryptAPI 与 .NET 代码的本机互操作 的相关文章

  • (Console.BufferHeight) 我无法使用 Console.WriteLine 查看/滚动查看所有控制台输出

    当我运行此代码时 输 出窗口顶部的数字是 99701 为什么我看不到一直到 1 的数字 我实际上看到所有数字都被输出 但在控制台窗口上 我只能滚动到足够高才能看到 99701 我猜 我在 Vista Home 上使用 Visual C Ex
  • 任务返回类型出错 - “x 有错误的返回类型”

    我有一行代码 即 bool stop await Task
  • 动态加载组件 - 设置和通信

    好吧 我有一个 WPF 应用程序 我们称之为Launcher exe 它加载并执行另一个 WPF 应用程序 我们称之为Loaded exe 动态地使用这样的东西 Byte assemblyData using BinaryReader re
  • 线程与并行处理

    Microsoft NET 4 0 为其框架引入了新的 并行增强功能 我想知道使用标准 System Threading 函数与新的并行增强功能创建应用程序之间有什么区别 并行扩展和常规线程之间最重要的区别可能是控制流 一个线程 使用创建n
  • 在 C# 中解析 Cryptocompare API Json 数据

    我正在加载数据 这是返回 Response Success Type 100 Aggregated false Data time 1504979760 high 14 26 low 14 26 open 14 26 volumefrom
  • 计算 IEnumerable 的计数(非泛型)

    谁能帮我一个Count扩展方法为IEnumerable 非通用接口 我知道LINQ不支持它 但是如何手动编写呢 yourEnumerable Cast Count 关于性能的评论 我认为这是过早优化的一个很好的例子 但你可以看一下 stat
  • 是否可以防止 DataGridView 中出现多行 HeaderText?

    当长度为HeaderText属性达到一定的字符限制并且文本中有空格 WinForms 会自动在标题中插入链接中断 我想要的是 Measurement Value 我得到什么 Measurement Value 有足够的空间来显示所有标题单元
  • WPF 的拖放列表框

    我正在寻找一个简单的ListBox具有内置的拖放功能 我认为 Silverlight 4 工具包有 The BoxList应该可以 通过拖放项目重新排序 从一个项目中拖动项目BoxList到另一个 显示拖动项目的预览 幽灵版本 显示放置位置
  • 提高UDP可靠性

    我正在构建一个基于 UDP 的小型服务器 服务器基于 Net并使用它自己的Socket类 我通过 ReceiveMessageFromAsync 和异步发送使用完成端口 我的问题是我失去了大约 5 10 的流量 现在我明白这是正常的 但是有
  • 需要重定向 .NET 应用程序的帮助

    我正在尝试让 vscode 启用统一的 c 代码完成 如下this https code visualstudio com docs other unity指南显示 我曾有一个problem https stackoverflow com
  • ZedGraph 垂直线与 LineObj 问题

    我有一个 ZedGraphControl 里面有几条曲线 我想在一些固定的 x 位置添加垂直线 当然 这些线只能位于实际图形区域内 我尝试以下 LineObj line new LineObj Color Black xPos myPane
  • Linq 警告

    Linq 是 NET 的一个很棒的补充 我发现它在很多情况下都对我很有帮助 尽管我才刚刚开始学习如何使用 Linq 然而 在阅读有关 Linq 的文章时 我发现开发人员需要留意一些微妙的事情 否则可能会导致麻烦 我已经添加了一个明确的警告
  • 使用异步时 SqlConnection 未被释放

    我有一个项目 有一个 Sql Server 数据库后端和 Dapper 作为 ORM 我正在尝试使用 Dapper 的QueryAsync 方法来获取一些数据 不仅如此 对我的存储库的调用来自几个使用 a 调用的任务内部Task WhenA
  • sqlParameters vs string.Format 哪个更能提高速度?

    sqlParameters vs string Format 哪个更能提高速度 在不承担安全性的情况下 cmd CommandText INSERT INTO tbl test VALUES a b SqlParameter SqlPara
  • 如何判断一个点是否属于某条线?

    如何判断一个点是否属于某条线 如果可能的话 示例值得赞赏 在最简单的形式中 只需将坐标代入直线方程并检查是否相等 Given Point p X 4 Y 5 Line l Slope 1 YIntersect 1 代入 X 和 Y Y Sl
  • 打印富文本框

    我正在制作一个简单的 WinForms 应用程序 我想允许用户从 RichTextBox 打印文本 我跟着MSDN链接 https msdn microsoft com en us library cwbe712d v vs 110 asp
  • 在 C++\Win32 中编辑控件文本更改消息

    与 NET for C Win32 中的 TextChanged 属性匹配的消息是什么 假设你正在谈论编辑控件 http msdn microsoft com en us library bb775458 VS 85 aspx EN CHA
  • 数据表到 JSON [重复]

    这个问题在这里已经有答案了 我最近需要将数据表序列化为 JSON 我现在仍然使用 Net 2 0 因此我无法在 Net 3 5 中使用 JSON 序列化器 我想这肯定是以前做过的 所以我上网查了一下found http www codepr
  • C# 中的自定义按钮:如何删除悬停背景?

    我正在尝试使用 Visual Studio 2005 对我的表单 其 FormBorderStyle none 执行自定义按钮 我在链接到该按钮的 ImageList 中有我的 3 种状态按钮图像 this btnClose AutoSiz
  • 在.Net中使用ObjectCache缓存对象并设置过期时间

    我陷入了一个场景 我的代码如下 更新 它不是关于如何使用数据缓存 我已经在使用它及其工作 它是关于扩展它 以便该方法在到期时间和从外部源获取新数据之间不会进行调用 object string this GetDataFromCache ca

随机推荐