标签: cryptoapi

带有WinCrypt和CryptImportKey的硬编码AES-256密钥

我需要让Win32应用程序加载一个硬编码的AES-256密钥,理想情况下使用WinCrypt.h方法.我的密钥在unsigned char [32]中,但我找不到正确的密钥blob格式传递给CryptImportKey.一切似乎都给我无效的参数错误.有没有办法做到这一点?

(同样重要的是如何在WinCrypt中设置IV.我根本看不到怎么做)

cryptography aes cryptoapi

3
推荐指数
1
解决办法
7272
查看次数

cryptoapi好吗?

我正在写一个加密的程序,做的东西像哈希(SHA1)加密,在C++的win32数字signatues建在CryptoAPI的安全,或者我应该使用一些其他图书馆像加密++我需要最大的安全性,并适用于所有系统XP和vista(以及可选的2000),但同时我需要最小化exe大小,因此不希望不需要的外部库

c++ cryptography cryptoapi

3
推荐指数
1
解决办法
1194
查看次数

用AES和CryptoAPI解密?当你知道KEY/SALT时

好的,所以我有一个专有的二进制格式.这基本上是几个不同栅格数据集的松散包装.无论如何,过去只是阅读这个和拆包是一件容易的事.但是现在在下一个版本中,光栅xml数据现在要使用AES-256进行加密(不是我的选择,我们也没有选择).

现在我们基本上发送了AES密钥以及他们正在使用的SALT,因此我们可以修改我们的unpackager.

注意这些不是钥匙只是一个例子:

它们每个都是63字节长的ASCII字符:

Key: "QS;x||COdn'YQ@vs-`X\/xf}6T7Fe)[qnr^U*HkLv(yF~n~E23DwA5^#-YK|]v."
Salt: "|$-3C]IWo%g6,!K~FvL0Fy`1s&N<|1fg24Eg#{)lO=o;xXY6o%ux42AvB][j#/&"
Run Code Online (Sandbox Code Playgroud)

我们基本上想用C++ CryptoAPI来解密它(我本周也是这里唯一的程序员,这明天就会上线.不是我们的错).我四处寻找一个实现这个的简单教程.不幸的是,我甚至找不到一个教程,他们分别有盐和密钥.基本上我现在所拥有的只是一个小型函数,它接收一个BYTE数组.随着它的长度.我怎样才能做到这一点?

我早上大部分时间都在尝试制作cryptoAPI的头/尾.但它的进展并不顺利:(

编辑

所以我问他们如何加密它.他们使用C#,并使用RijndaelManaged,据我所知,它不等同于AES.

EDIT2

好吧,终于得到了正在发生的事情,他们给了我们错误的钥匙.

他们正在做以下事情:

填充= PKCS7 CipherMode = CBC密钥定义为一组32字节(十六进制).IV也被定义为一组32字节(十六进制).

当我问他们时,他们带走了盐.

使用wincrypt.h头文件在CryptoAPI中设置这些东西有多难.

c++ cryptoapi rijndaelmanaged

3
推荐指数
1
解决办法
5693
查看次数

Windows CryptoAPI:带有CALG_SHA_256的CryptSignHash和来自MY keystore的私钥

我试图在Windows上生成数字签名(来自XP SP3,但目前正在使用Windows 7进行测试),其中CryptoAPI将与以下openssl命令兼容:

openssl dgst -sha256 -sign <parameters> (for signing)
openssl dgst -sha256 -verify <parameters> (for validation)
Run Code Online (Sandbox Code Playgroud)

我想使用Windows"MY"密钥库中的私钥进行签名.

我设法使用SHA1摘要算法使用以下CryptoAPI函数签署文件(为简洁省略参数):

CertOpenStore
CertFindCertificateInStore
CryptAcquireCertificatePrivateKey
CryptCreateHash (with CALG_SHA1)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)

生成的签名与"openssl dgst -sha1 -verify"兼容(一旦字节顺序颠倒).

我的问题是:当我尝试将CALG_SHA_256与CryptCreateHash一起使用时,它会因错误80090008(NTE_BAD_ALGID)而失败.通过谷歌搜索左右,我发现,我需要使用特定的提供者(PROV_RSA_AES),而不是默认的一个.由于我有一个提供者句柄,我还需要用CryptGetUserKey替换CryptAcquireCertificatePrivateKey.所以我修改了我的程序,看起来像:

CryptAcquireContext (with PROV_RSA_AES)
CertOpenStore
CertFindCertificateInStore
CryptGetUserKey
CryptCreateHash (with CALG_SHA256)
CryptHashData
CryptSignHash
Run Code Online (Sandbox Code Playgroud)

不幸的是,这没有按预期工作:CryptGetUserKey失败,错误8009000D(NTE_NO_KEY).如果我删除了CryptGetUserKey调用,程序将一直运行,直到CryptSignHash失败,错误80090016(NTE_BAD_KEYSET).我知道密钥集确实存在并且工作正常,因为我能够使用它来签署SHA1摘要.

我尝试使用从CertFindCertificateInStore获得的证书上下文中的信息再次获取上下文:我能做的最好的是成功的CryptGetUserKey调用,但CryptSignHash总是会失败并出现相同的错误.

我试图使用的私钥是2048位长,但我不认为它是一个问题,因为它与SHA1摘要一起使用.我很茫然,所以任何建议都会非常受欢迎!

cryptography rsa sha256 cryptoapi digital-signature

3
推荐指数
2
解决办法
1万
查看次数

我可以从智能卡中的密钥容器获取公钥/私钥对吗?

我可以使用PKCS#11或CryptoAPI从智能卡内的密钥容器中获取公钥/私钥对吗?

c++ smartcard cryptoapi pkcs#11 private-key

3
推荐指数
2
解决办法
3603
查看次数

MS CryptoAPI在带有CryptAcquireContext()的Windows XP上不起作用

我使用Microsoft CryptoAPI编写了一些代码来计算SHA-1并使得编译的exe工作在Windows 7,Win Server 2008,Win Server 2003上.但是,当我在Windows XP SP3下运行它时,它不起作用.

我缩小了对CryptAcquireContext()电话的失败.

我注意到之前的帖子谈到了XP的错误命名" ......(Prototype) ",并且必须通过使用WinXP特定宏MS_ENH_RSA_AES_PROV_XP来解决.

我做了XP特定的代码修改,它仍然无法正常工作.(bResult在Win XP上返回0 false,所有其他平台bResult返回1为真.)

我检查了MS_ENH_RSA_AES_PROV_XP,其中包含我在regedit.exe中看到的实际键+字符串值,所以一切看起来都已设置为工作但没有成功.

我是否忽略了一些可以在Windows XP上运行的东西?

我贴了最短的例子来说明这个问题.我使用的是VS2010 C++.

// based on examples from http://msdn.microsoft.com/en-us/library/ms867086.aspx

#include "windows.h"
#include "wincrypt.h"
#include <iostream>
#include <iomanip>  // for setw()

void main()
{
    BOOL bResult;
    HCRYPTPROV hProv;

    // Attempt to acquire a handle to the default key container.
    bResult = CryptAcquireContext(
        &hProv,            // Variable to hold returned handle.
        NULL,              // Use default key container. …
Run Code Online (Sandbox Code Playgroud)

c++ sha1 visual-studio-2010 cryptoapi mscapi

3
推荐指数
1
解决办法
3717
查看次数

使用PInvoke的CryptoAPI的SignerTimeStampEx2

我正在尝试使用C#代码中的CryptoAPI将SHA256时间戳添加到已签名的程序集中.这是我正在使用的代码:

Signer.TimestampSignedAssembly("MyAssembly.exe", "http://tsa.starfieldtech.com");
Run Code Online (Sandbox Code Playgroud)

签名者类:

public static class Signer
{
    [StructLayoutAttribute(LayoutKind.Sequential)]
    struct SIGNER_SUBJECT_INFO
    {
        public uint cbSize;
        public IntPtr pdwIndex;
        public uint dwSubjectChoice;
        public SubjectChoiceUnion Union1;
        [StructLayoutAttribute(LayoutKind.Explicit)]
        internal struct SubjectChoiceUnion
        {
            [FieldOffsetAttribute(0)]
            public IntPtr pSignerFileInfo;
            [FieldOffsetAttribute(0)]
            public IntPtr pSignerBlobInfo;
        }
    }

    [StructLayoutAttribute(LayoutKind.Sequential)]
    struct SIGNER_FILE_INFO
    {
        public uint cbSize;
        public IntPtr pwszFileName;
        public IntPtr hFile;
    }

    [DllImport("Mssign32.dll", CharSet = CharSet.Unicode, SetLastError = true)]
    private static extern int SignerTimeStampEx2(
        uint dwFlags,               // DWORD
        IntPtr pSubjectInfo,        // SIGNER_SUBJECT_INFO
        string pwszHttpTimeStamp,   // LPCWSTR
        uint dwAlgId, …
Run Code Online (Sandbox Code Playgroud)

c# pinvoke timestamp sha256 cryptoapi

3
推荐指数
1
解决办法
874
查看次数

Ubuntu 16.04上的System.Security.Cryptography.Csp

我有使用加密技术的ASP.Net Core 1.0.0应用程序.我需要使用解密密钥RSACryptoServiceProvider.Visual Studio建议将System.Security.Cryptography.Csp4.0.0版添加到我的依赖项中.我接受了,在Windows上它一切正常.但是当我在Ubuntu 16.04上部署它时,RSACryptoServiceProvider方法开始抛出PlatformNotSupportedException异常.我使用错误的装配吗?我找到https://github.com/dotnet/corefx/tree/v1.0.0/src/System.Security.Cryptography.Csp并且有1.0.0版本.这就是我需要的吗?如何将其添加到我的项目中?

c# cryptoapi asp.net-core ubuntu-16.04

3
推荐指数
1
解决办法
717
查看次数

TLS 1.2 - 提供给函数的令牌无效

我有这个奇怪的问题,SslStream.AuthenticateAsClient() 抛出以下异常:

System.Security.Authentication.AuthenticationException : A call to SSPI failed, see inner exception.
  ----> System.ComponentModel.Win32Exception : The token supplied to the function is invalid
Run Code Online (Sandbox Code Playgroud)

仅当客户端需要 Tls12 时才会发生:

SslStream.AuthenticateAsClient(..., ..., SslProtocols.Tls12);
Run Code Online (Sandbox Code Playgroud)

代码适用于 Ssl3、Tls11 和 Tls。

服务器证书是自签名的并且是“旧的”。它使用 md5RSA 签名和 1024 位,最初我认为这就是问题所在,因为重新生成证书会使异常消失(我厌倦了 SHA1 和 SHA512 - 都可以)。

然而,令我惊讶的是,FileZilla 客户端能够使用这个“旧”md5RSA 签名证书并使用TLS 1.2连接到该服务器:

使用旧证书的 TLS 1.2

这是证书:

-----BEGIN CERTIFICATE-----
MIICejCCAeOgAwIBAgIQzbvZdHHAV49D7R8OE2mEaDANBgkqhkiG9w0BAQQFADBA
MSswKQYJKoZIhvcNAQkBFhxlbWFpbEBpbi10aGUtY2VydGlmaWNhdGUuY29tMREw
DwYDVQQDEwhKb2huIERvZTAeFw0xMTAxMjAyMDAzNDFaFw0zOTEyMzEyMzU5NTla
MEAxKzApBgkqhkiG9w0BCQEWHGVtYWlsQGluLXRoZS1jZXJ0aWZpY2F0ZS5jb20x
ETAPBgNVBAMTCEpvaG4gRG9lMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC0
s5RAKYdw2AYk3t0oH5jDo6RQRRfabkOLfKvR8kOiYbqjtgblx7JhSZJHX/r6KLoc
hGgYkQPOSKnl8TdgEkzPxWHECV/iMdOxTsTv2P//ZM2INjb4H8JjDS16PYFwHP3w
/9RU6PjppK+mPdWP1pezBzebSM0QQwpmXlSmfe2ULQIDAQABo3UwczBxBgNVHQEE
ajBogBA4WNgTvhkmRD8DhHeRvAJcoUIwQDErMCkGCSqGSIb3DQEJARYcZW1haWxA
aW4tdGhlLWNlcnRpZmljYXRlLmNvbTERMA8GA1UEAxMISm9obiBEb2WCEM272XRx
wFePQ+0fDhNphGgwDQYJKoZIhvcNAQEEBQADgYEAFX6MM/E97hC6t1TAFBmM3tWr
fQ2cB0LFCe6J0I8phKQecpSYCkMdvaHdsT+sdzXNW4bgL064r731r8l/47VgfgIR
oRmsQYnwJ55nqZpEW2zL3vioedWiCVto8X9/dVC8jqPpcmMP5NWBHh88o7nkPBxe
C8iucrQvHnjYwaz1o/M=
-----END CERTIFICATE-----
Run Code Online (Sandbox Code Playgroud)

我的问题是:

  1. 为什么SslStream.AuthenticateAsClient会抛出异常,而 Filezilla 客户端却能够连接?

  2. 使用 TLS 1.2 时是否有任何 …

.net ssl cryptography cryptoapi tls1.2

3
推荐指数
1
解决办法
3万
查看次数

是否可以使用wincrypt进行HMAC?

我一直在尝试使用wincrypt/cryptoapi/Cryptography API执行直接的SHA256 HMAC:下一代(CNG),我真的很挣扎.我的目标是Windows 8.

我找不到正确的方法或在任何地方找到任何例子.我希望在C/C++中执行以下操作,这在下面的C#中进行了演示

        HMAC hashMaker = new HMACSHA256(Encoding.ASCII.GetBytes("SecretKey"));
        byte[] hash = hashMaker.ComputeHash(Encoding.ASCII.GetBytes("<SomeXmlData />"));
        string hashStr = BitConverter.ToString(hash);
Run Code Online (Sandbox Code Playgroud)

它返回哈希:B2-42-48-67-5A-B8-03-87-5B-00-D7-8C-65-5A-AE-B7-92-E3-F9-27-40-C1-01 -A5-37-74-E1-65-51-9F-F6-6A.

有没有人成功使用cryptoapi执行直接HMAC?

c c++ winapi cryptoapi hmac

2
推荐指数
1
解决办法
2551
查看次数