标签: cryptoapi

在JUnit中生成HmacSHA256签名

我正在尝试将我的消息签名到Amazon AWS(在JUnit测试中),但我遇到了一个问题.这是我正在使用的代码:

String secretAccessKey = "secret1234678901";        
SecretKeySpec keySpec = new SecretKeySpec(secretAccessKey.getBytes(UTF-8), "HmacSHA256");
Mac mac = Mac.getInstance(this.MAC_ALGO);
mac.init(keySpec); // here it breaks
byte[] encoded = mac.doFinal(
    request.toString().getBytes(this.CHARSET));
return Base64.encodeBase64URLSafeString(encoded);
Run Code Online (Sandbox Code Playgroud)

在标记为(mac.init(...))的行中抛出异常:

java.lang.ClassCastException: com.sun.crypto.provider.HmacSHA1 cannot be cast to javax.crypto.MacSpi
    at javax.crypto.Mac.a(DashoA13*..)
    at javax.crypto.Mac.init(DashoA13*..)
Run Code Online (Sandbox Code Playgroud)

你知道为什么会这样吗?我在网上看到的所有代码看起来几乎都是这样的,我也尝试过使用HmacSHA1,结果相同.

java junit cryptography cryptoapi powermock

11
推荐指数
1
解决办法
4672
查看次数

是否有一个API来预检索Windows上受信任的根证书列表?

我使用Python和OpenSSL使用TLS连接到一个站点(在一些跨平台的软件中,所以切换到CryptoAPI的工作量太大了); 但是,我不想分发(和更新)自定义证书列表.我想从平台上获取它们.在OS X和Linux上,这是相当简单的,但Windows附带了一个不完整的TLS可信根证书颁发机构列表; 基本上只是微软自己的证书,然后当高级TLS内容(例如通过HTTPS在Internet Explorer中加载网页)必须验证以前没有看到的信任根时,动态地将信任根添加到商店. (此过程在此处进行了解释.) 这意味着我可以枚举Windows根证书存储区wincertstore,但它没用,因为在最近安装了较新操作系统的计算机上,该存储区几乎为空.

Microsoft 为管理员提供详细说明,以便预先检索此列表,以便能够操作具有严格控制的网络访问权限的计算机; 但是,我找不到任何可以执行相同操作的API的引用,只需从Microsoft下载所有受信任的根证书.(老实说,在每周多兆字节系统更新的时代,我不明白为什么预先下载这些是如此重要,如果它只是一个缓存;对于奖励积分,请解释为什么这需要发生.)

那么:是否有一个API允许我告诉系统根据它使用的任何规则预先缓存受信任的根证书?如果失败了,如果真的不可能(例如,如果CryptoAPI一次只能下载一个信任根,并且只有当你提供由该根签名的证书),是否有办法将OpenSSL证书验证连接到CryptoAPI的信任存储区,以便验证将下载和缓存信任根,就像本机TLS连接一样?

windows ssl cryptoapi

11
推荐指数
1
解决办法
1130
查看次数

如何在linux内核2.6中使用CryptoAPI

我一直在寻找一些时间,但没有找到足够的文档/示例,如何使用Linux附带的CryptoAPI来创建系统调用/内核域.

如果有人知道一个好的来源请告诉我,我想知道如何在内核空间内进行SHA1/MD5和Blowfish/AES.

kernel kernel-module cryptoapi linux-kernel

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

Windows XP与Vista/7上的MS Crypto API行为

我试图了解如何在XP,Vista和Windows 7中获取从PEM格式导入的公钥(下面的代码中包含的示例).示例代码将导入XP和Windows Vista/7上的密钥,但不是一样的方法.

在Windows XP上,加密提供程序的名称中需要字符串"(Prototype)",并允许调用CryptImportPublicKeyInfo进行传递.

在Windows 7上,"(Prototype)"提供程序显然存在,但不支持对CryptImportPublicKeyInfo的调用,这令人困惑.

这些操作系统之间的正确实现是什么样的?是否有必要检测XP并使用"(Prototype)"请求名称,而没有它用于其他操作系统?是否有可能在某些XP系统上仍会失败?

或者,有没有办法检测这种混乱的行为,并选择哪个加密提供商将支持必要的呼叫?

Windows 7上的输出:

ANALYZING CRYPTOGRAPHIC SUPPORT FOR:
     "Microsoft Enhanced RSA and AES Cryptographic Provider"
     CryptAcquireContext success.
     CryptAcquireContext.1 success.
     CryptStringToBinary.2 success.
     CryptDecodeObjectEx success.
     CryptImportPublicKeyInfo success.
     SUCCESS.
ANALYZING CRYPTOGRAPHIC SUPPORT FOR:
     "Microsoft Enhanced RSA and AES Cryptographic Provider (Prototype)"
     CryptAcquireContext success.
     CryptAcquireContext.1 success.
     CryptStringToBinary.2 success.
     CryptDecodeObjectEx success.
     CryptImportPublicKeyInfo FAILED****.
Run Code Online (Sandbox Code Playgroud)

Windows XP上的输出:

ANALYZING CRYPTOGRAPHIC SUPPORT FOR:
     "Microsoft Enhanced RSA and AES Cryptographic Provider"
     CryptAcquireContext success.
     CryptAcquireContext.1 success.
     CryptStringToBinary.2 success. …
Run Code Online (Sandbox Code Playgroud)

c++ windows-xp cryptoapi mscapi

9
推荐指数
1
解决办法
6569
查看次数

CryptoAPI:使用CryptVerifySignature通过公钥验证openssl的签名

我正在尝试将Mac 的AquaticPrime框架移植到Windows.

在Mac上,它使用的是opensll库,我试着理解如何将它移植到Windows,我想在那里我必须使用CryptoAPI.

我主要需要使用给定公钥验证生成的签名的代码.

以下是使用openssl进行验证的方法:

  1. 输入:许可证数据,公钥和签名,长度均为128字节.
  2. SHA1摘要是根据许可证数据计算的.
  3. 使用公钥数据建立RSA上下文
  4. 在给定RSA密钥和签名的情况下调用RSA_public_decrypt(),该签名返回20字节长的SHA1摘要 - 该摘要等于步骤2中的摘要,签名有效.

那么,我如何使用CryptoAPI执行此操作?我到目前为止:

  1. 从CryptAcquireContext开始(ctx,0,0,PROV_RSA_FULL,CRYPT_VERIFYCONTEXT)
  2. 帖子的帮助下使用CryptImportKey ,pubexp = 3,bitlen = 1024.一切正常,即我没有错误,我查看了二进制数据,以验证它是否与MSDN文章显示的相匹配.
  3. 从许可证数据创建SHA1摘要.我检索了生成的20字节哈希值,看到它与Mac上的openssl相匹配.

此时,我打电话给:

CryptVerifySignature (hashHdl, sig, sigLen, keyHdl, 0, 0)
Run Code Online (Sandbox Code Playgroud)

此操作失败,错误代码为ERROR_INVALID_PARAMETER.

奇怪的是,当我第一次意外地将两倍大的公钥存储到PUBLICKEYBLOB结构中时,我收到了一个N​​TE_BAD_SIGNATURE错误.这可能表明我现在传递的公钥是正确的.

为什么现在出现ERROR_INVALID_PARAMETER错误?我已经验证了哈希值是正确的,并且密钥似乎也被接受了.并且"sig"参数只是指向签名的128个字节的指针,而sigLen是128.

那么,我在这里错过了什么?

openssl rsa cryptoapi aquaticprime

8
推荐指数
1
解决办法
3837
查看次数

使用java访问MS CryptoAPI

我试图充分利用MS CAPI,并且陷入了一个巨大的恶作剧......只有SunMSCapi提供商,嗯,提供,至少在签名方面缺少更好的词,以下算法:

  • MD2withRSA
  • MD5withRSA
  • SHA1withRSA

而且我并不急于使用这样的算法GOST3411withECGOST3410,或者RIPEMD128withRSABouncyCastle 使用的算法,但它会很好,并且在这种特殊情况下,如果不是必要的话,至少能够登录SHA256withRSA算法是非常重要的. ..(512等等和ECDSA加密,将是一个很大的优势,但我不指望那么多).

我试图找到一个替代品,但只找到这个包装,看起来很好,但我不得不再挖一点.

有没有人知道另一种方式,包装或提供者访问mscapi(cryptoapi)?


有关:

java sha256 cryptoapi mscapi

8
推荐指数
1
解决办法
2876
查看次数

.Net:我的RSA密钥在2012年8月之后仍然有效吗?

我刚读过这篇文章,阻止了1024位以下的RSA密钥,在我的.NET软件中,我大量使用了384位密钥.我的程序是否仍然可以使用RSACryptoServiceProvider从MachineKeyStore生成/存储/读取密钥?或者我会被迫发送补丁?

.net cryptography rsa rsacryptoserviceprovider cryptoapi

8
推荐指数
1
解决办法
327
查看次数

CAPI不支持基于密码的加密(PBE)加密?

我正在尝试使用OpenSSL(PKCS#5和PKCS#7)将UNIX代码移植到Windows.

在OpenSSL的情况下,所有编码/解码(证书或密码)都是在CMS_Encrypt函数中对调用者透明地完成的 ,应该是这样.

CAPI在函数CryptEncryptMessage内部进行基于证书的加密时也会做同样的事情 (没有向调用者显示ASN详细信息).经过一些谷歌搜索,我发现了以下密钥生成实现.现在我该如何在CAPI中使用它?

因为CAPI不支持高级别的PBE加密(PBKDF2),我的猜测是必须手动完成编码(不知何故?).手动我的意思是写(和读)各种ASN标签的二进制表示.我该怎么做?

我无法访问msasn1.h API,因为msasn1.lib永远不会分发.除了基于证书的加密之外,有没有人能够使用CAPI接口做其他事情?

c++ cryptoapi pbkdf2

8
推荐指数
0
解决办法
510
查看次数

RSA_public_decrypt和MS Crypto API等效

我正在尝试开发许可证验证解决方案.许可证使用OpenSSL的RSA_private_encrypt功能在服务器上进行编码.

对于Mac OX XI使用RSA_public_decrypt,它就像一个魅力.在Windows上我必须使用非常小的代码,因此我无法与OpenSSL或其他lib链接,我必须使用MS Crypto API.

我花了几天时间试图找出问题所在,但没有运气.我可以成功导入公钥,但在这里我的成功结束了.我知道我需要用CAPI来反转字节顺序,所以这可能不是问题.

我已经尝试了所有的东西,包括CryptVerifyMessageSignatureWithKeyCryptDecodeObject用不同的参数加载blob,但仍然没有运气.

它总是最终结束GetLastError() == CRYPT_E_ASN1_BADTAG,我认为这意味着BLOB不是ASN1格式的......谷歌没有告诉任何关于RSA_private_encrypt的输出格式...所以我完全迷失在这里.

这是基于OpenSSL的OS X代码:

void cr_license_init(const char* lic) {
    __cr_license_ = lic;
    unsigned char lic_encoded[CR_LIC_LEN];

    BIO* b64 = BIO_new(BIO_f_base64());
    BIO* licIn = BIO_new_mem_buf((void*)lic, -1);
    licIn = BIO_push(b64, licIn);

    if(BIO_read(licIn, lic_encoded, CR_LIC_LEN) == CR_LIC_LEN) {

        const unsigned char* key_data = license_pub_der;
        RSA* r = d2i_RSA_PUBKEY(NULL, &key_data, sizeof(license_pub_der));

        if(r != NULL) {
            if(__cr_license_data_ != NULL) {
                free((void*)__cr_license_data_);
            }
            __cr_license_data_ = malloc(CR_LIC_LEN);
            if(RSA_public_decrypt(CR_LIC_LEN, lic_encoded, …
Run Code Online (Sandbox Code Playgroud)

windows openssl cryptography rsa cryptoapi

8
推荐指数
1
解决办法
2720
查看次数

Java安全性 - MSCAPI提供者:如何在没有密码弹出的情况下使用?

我已经设法在我的应用程序中使用Sun的MSCAPI提供程序.我现在遇到的问题是它总是弹出一个窗口,要求输入密码,即使我已经在代码中提供了密码.这是一个问题,因为我需要在Web服务中使用加密功能.

这是我现在的代码:

String alias = "Alias to my PK";
char[] pass = "MyPassword".toCharArray();

KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pass);
Provider p =  ks.getProvider();

Signature sig = Signature.getInstance("SHA1withRSA",p);
PrivateKey key = (PrivateKey) ks.getKey(alias, pass)

sig.initSign(key);
sig.update("Testing".getBytes());
sig.sign();
Run Code Online (Sandbox Code Playgroud)

这工作得很好,但是当最后一行运行时,我会弹出一个要求输入密码的弹出窗口.我该如何预防呢?

java security cryptography cryptoapi

7
推荐指数
1
解决办法
6583
查看次数