C# 为什么.NET中的CNG要求低于非托管CNG?

C# 为什么.NET中的CNG要求低于非托管CNG?,c#,.net,cng,C#,.net,Cng,NET和非托管代码中对CNG的最低要求如此不一致,是否有逻辑上的原因?比如说, NCryptDeleteKey(非托管CNG)需要Windows Vista或Server 2008: 但是CngKey.delete(显然是托管CNG)只需要.NET 3.5,它可以从Windows 7访问: 根据呼叫的不同,有些要求与4.6.2一样高,例如: AesCng构造函数访问现有AES CNG密钥: 但是你仍然可以从一台经过适当更新的Windows7机器上调用它。那么为什么会有这样的差异呢 正确更新

NET和非托管代码中对CNG的最低要求如此不一致,是否有逻辑上的原因?比如说,

NCryptDeleteKey(非托管CNG)需要Windows Vista或Server 2008:

但是CngKey.delete(显然是托管CNG)只需要.NET 3.5,它可以从Windows 7访问:

根据呼叫的不同,有些要求与4.6.2一样高,例如:

AesCng构造函数访问现有AES CNG密钥:

但是你仍然可以从一台经过适当更新的Windows7机器上调用它。那么为什么会有这样的差异呢


正确更新的Windows 7计算机是否可能可靠地调用NCryptDeleteKey?

托管意味着它们在.NET Framework中实现。非托管意味着它们必须由操作系统提供,而随着时间的推移,Microsoft一直在改进Windows附带的功能。

它们并不矛盾。他们是不同的提供者。非托管的由操作系统提供。如果操作系统没有它们,它就不能提供它们。另一方面,最早支持的.NET版本是4.5.2。服务器支持的最早Windows版本是2012,如果不是更高版本的话。您可以假设所有提供程序都可用,但不应直接调用提供程序。它们都实现了相同的接口,这意味着您可以在创建它们时按名称指定它们,甚至可以通过配置来指定它们。我的组织希望最大化遗留支持。我必须有一个很好的理由不支持完全升级的Windows7,这就是为什么我问这个问题。那么…如果我理解正确的话,.NET framework添加了操作系统级别上不可用的功能?这就是区别吗?@timothyjohnlair正是。@timothyjohnlair是和否。“非托管”提供商可能是安全笔记本电脑的智能卡提供商。这是由操作系统提供的。操作系统中较新的提供程序为SSE2命令提供了更好的支持。云提供的KMS服务可能显示为操作系统提供商或托管提供商,无论供应商提供什么。他们是不同的提供者。如果你想兼容。不要直接提到他们。在配置文件中指定它们。那么,在C++中压缩CNG会有什么收获呢?如果我的大多数代码是用C++编写的,使用非托管C++ CNG有什么好的理由吗?@ TimoTythJang-Lyrd非托管可能会有更好的性能。当你试图不正确地将结果封送到应用程序时,你可能会付出额外的开销。NET已经可以很好地与非托管提供程序配合使用。成本来自加密计算,而不是如何将单个缓冲区传递给them@PanagiotisKanavos嘿,你能不能对诸如
SHA1Managed
之类的类和通过工厂方法
SHA1.Create()
创建的实例做一些介绍?有什么区别?他们都使用CNG API吗?如果不是的话,就是不受管理的,它是通过COM还是P/Invoke实现的?我只是好奇,非常感谢你的阅读。@SpiritBob如果你想问什么,就发一个问题。