有关USBKEY的密钥句柄怎样得到

难题 2014-03-24 12:00:55
现在又一段密文,我需要得到USBKEY里面的密钥,再调用cryptdecrypt进行解密,求助怎样写?
新手的痛苦啊,网上有没有相关文档,有的都是一大篇的理论,没有实际操作
已近在网上看到了,对文件加解密,但是不是关联USBKEY的
...全文
777 30 打赏 收藏 转发到动态 举报
写回复
用AI写文章
30 条回复
切换为时间正序
请发表友善的回复…
发表回复
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 1 楼 movsd 的回复:
找到USBKEY的生产厂商,在他们的网站上可以找到这种USBKEY的开发包及文档。
不是通过CRYPTAPI来得到的? 这个问题已经困扰了我一周了,网上有没有相关例子
movsd 2014-03-24
  • 打赏
  • 举报
回复
找到USBKEY的生产厂商,在他们的网站上可以找到这种USBKEY的开发包及文档。
难题 2014-03-24
  • 打赏
  • 举报
回复
有没有大神来告诉下怎么解决这个问题啊
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 28 楼 movsd 的回复:
Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file tsp_eps3k_sc_citic.dll File Type: DLL Section contains the following exports for tsp_eps3k.dll 0 characteristics 4E9B9C3E time date stamp Mon Oct 17 11:08:46 2011 0.00 version 1 ordinal base 31 number of functions 31 number of names ordinal hint RVA name 1 0 00019220 TSPChangePin 2 1 0001AD50 TSPChangeToPKIApp 3 2 0001AC50 TSPCreateFile 4 3 0001AA50 TSPCreatePKIApp 5 4 0001ACD0 TSPCreatePKIAppEnd 6 5 0001B900 TSPDecrypt 7 6 0001C650 TSPDirectCmd 8 7 0001B730 TSPEncrypt 9 8 0001C720 TSPExtraCmd 10 9 00018C80 TSPFinalize 11 A 0001BE30 TSPGenKey 12 B 0001BE40 TSPGenKeyPair 13 C 0001B440 TSPGenRandom 14 D 00018850 TSPGetLibInfo 15 E 000199D0 TSPGetProperty 16 F 00018D10 TSPGetVersion 17 10 00018F90 TSPInitPin 18 11 00018DB0 TSPInitRoot 19 12 00018AC0 TSPInitialize 20 13 0001A900 TSPLockToken 21 14 0001AF00 TSPOpenFile 22 15 0001B0C0 TSPReadBinary 23 16 0001C0B0 TSPReadKey 24 17 0001AA20 TSPResetStatus 25 18 0001C8A0 TSPSetEnvRoot 26 19 0001BBA0 TSPSign 27 1A 0001A990 TSPUnlockToken 28 1B 0001BE30 TSPVerify 29 1C 00019650 TSPVerifyPin 30 1D 0001B280 TSPWriteBinary 31 1E 0001C3B0 TSPWriteKey Summary D000 .data 9000 .rdata 6000 .reloc 1000 .rsrc 3E000 .text 另外还有两个文件tsp_ft11_hid_31.dll,tsp_ft11_hid_citic.dll,导出函数是一样的,可能是对应不同的设备,你安装了驱动,在C:\Program Files\ngsrv\tsp就能找到这些文件,不过只有函数名,没有调用参数的资料。
额,没有参数,那不就是不知道怎么调啊
movsd 2014-03-24
  • 打赏
  • 举报
回复
Microsoft (R) COFF Binary File Dumper Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved. Dump of file tsp_eps3k_sc_citic.dll File Type: DLL Section contains the following exports for tsp_eps3k.dll 0 characteristics 4E9B9C3E time date stamp Mon Oct 17 11:08:46 2011 0.00 version 1 ordinal base 31 number of functions 31 number of names ordinal hint RVA name 1 0 00019220 TSPChangePin 2 1 0001AD50 TSPChangeToPKIApp 3 2 0001AC50 TSPCreateFile 4 3 0001AA50 TSPCreatePKIApp 5 4 0001ACD0 TSPCreatePKIAppEnd 6 5 0001B900 TSPDecrypt 7 6 0001C650 TSPDirectCmd 8 7 0001B730 TSPEncrypt 9 8 0001C720 TSPExtraCmd 10 9 00018C80 TSPFinalize 11 A 0001BE30 TSPGenKey 12 B 0001BE40 TSPGenKeyPair 13 C 0001B440 TSPGenRandom 14 D 00018850 TSPGetLibInfo 15 E 000199D0 TSPGetProperty 16 F 00018D10 TSPGetVersion 17 10 00018F90 TSPInitPin 18 11 00018DB0 TSPInitRoot 19 12 00018AC0 TSPInitialize 20 13 0001A900 TSPLockToken 21 14 0001AF00 TSPOpenFile 22 15 0001B0C0 TSPReadBinary 23 16 0001C0B0 TSPReadKey 24 17 0001AA20 TSPResetStatus 25 18 0001C8A0 TSPSetEnvRoot 26 19 0001BBA0 TSPSign 27 1A 0001A990 TSPUnlockToken 28 1B 0001BE30 TSPVerify 29 1C 00019650 TSPVerifyPin 30 1D 0001B280 TSPWriteBinary 31 1E 0001C3B0 TSPWriteKey Summary D000 .data 9000 .rdata 6000 .reloc 1000 .rsrc 3E000 .text 另外还有两个文件tsp_ft11_hid_31.dll,tsp_ft11_hid_citic.dll,导出函数是一样的,可能是对应不同的设备,你安装了驱动,在C:\Program Files\ngsrv\tsp就能找到这些文件,不过只有函数名,没有调用参数的资料。
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 25 楼 fengqinqdca 的回复:
[quote=引用 22 楼 u013823973 的回复:] 可以随便写一个你进行解密的接口吗,对照函数名我去找找看,最好带上参数啊
参见24的方法 微软自带的加密库 wincrypt[/quote] 不是,是写一个你用过的进行解密的函数名,最好带上参数。如微软的cryptdecrypt,不同厂家的解密函数不同,随便写一个就行
难题 2014-03-24
  • 打赏
  • 举报
回复
25楼的方法是对文件加密,而且是对称加密。对密码进行HASH产生会话密钥,解密的时候还是要输入密码,HASH再解密。这个对USBKEY没用啊啊!~~~
华美乐章 2014-03-24
  • 打赏
  • 举报
回复
引用 22 楼 u013823973 的回复:
可以随便写一个你进行解密的接口吗,对照函数名我去找找看,最好带上参数啊
参见24的方法 微软自带的加密库 wincrypt
赵4老师 2014-03-24
  • 打赏
  • 举报
回复
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "advapi32.lib")
#define _WIN32_WINNT 0x0400
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE  (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define KEYLENGTH  0x00800000
void HandleError(char *s);
//--------------------------------------------------------------------
//  These additional #define statements are required.
#define ENCRYPT_ALGORITHM CALG_RC4
#define ENCRYPT_BLOCK_SIZE 8
//   Declare the function EncryptFile. The function definition
//   follows main.
BOOL EncryptFile(
    PCHAR szSource,
    PCHAR szDestination,
    PCHAR szPassword);
//--------------------------------------------------------------------
//   Begin main.
void main(void) {
    CHAR szSource[100];
    CHAR szDestination[100];
    CHAR szPassword[100];
    printf("Encrypt a file. \n\n");
    printf("Enter the name of the file to be encrypted: ");
    scanf("%s",szSource);
    printf("Enter the name of the output file: ");
    scanf("%s",szDestination);
    printf("Enter the password:");
    scanf("%s",szPassword);
    //--------------------------------------------------------------------
    // Call EncryptFile to do the actual encryption.
    if(EncryptFile(szSource, szDestination, szPassword)) {
        printf("Encryption of the file %s was a success. \n", szSource);
        printf("The encrypted data is in file %s.\n",szDestination);
    } else {
        HandleError("Error encrypting file!");
    }
} // End of main
//--------------------------------------------------------------------
//   Code for the function EncryptFile called by main.
static BOOL EncryptFile(
    PCHAR szSource,
    PCHAR szDestination,
    PCHAR szPassword)
//--------------------------------------------------------------------
//   Parameters passed are:
//     szSource, the name of the input, a plaintext file.
//     szDestination, the name of the output, an encrypted file to be
//         created.
//     szPassword, the password.
{
    //--------------------------------------------------------------------
    //   Declare and initialize local variables.
    FILE *hSource;
    FILE *hDestination;
    HCRYPTPROV hCryptProv;
    HCRYPTKEY hKey;
    HCRYPTHASH hHash;
    PBYTE pbBuffer;
    DWORD dwBlockLen;
    DWORD dwBufferLen;
    DWORD dwCount;
    //--------------------------------------------------------------------
    // Open source file.
    if(hSource = fopen(szSource,"rb")) {
        printf("The source plaintext file, %s, is open. \n", szSource);
    } else {
        HandleError("Error opening source plaintext file!");
    }
    //--------------------------------------------------------------------
    // Open destination file.
    if(hDestination = fopen(szDestination,"wb")) {
        printf("Destination file %s is open. \n", szDestination);
    } else {
        HandleError("Error opening destination ciphertext file!");
    }
    //以下获得一个CSP句柄
    if(CryptAcquireContext(
                &hCryptProv,
                NULL,               //NULL表示使用默认密钥容器,默认密钥容器名
                //为用户登陆名
                NULL,
                PROV_RSA_FULL,
                0)) {
        printf("A cryptographic provider has been acquired. \n");
    } else {
        if(CryptAcquireContext(
                    &hCryptProv,
                    NULL,
                    NULL,
                    PROV_RSA_FULL,
                    CRYPT_NEWKEYSET))//创建密钥容器
        {
            //创建密钥容器成功,并得到CSP句柄
            printf("A new key container has been created.\n");
        } else {
            HandleError("Could not create a new key container.\n");
        }
    }
    //--------------------------------------------------------------------
    // 创建一个会话密钥(session key)
    // 会话密钥也叫对称密钥,用于对称加密算法。
    // (注: 一个Session是指从调用函数CryptAcquireContext到调用函数
    //   CryptReleaseContext 期间的阶段。会话密钥只能存在于一个会话过程)
    //--------------------------------------------------------------------
    // Create a hash object.
    if(CryptCreateHash(
                hCryptProv,
                CALG_MD5,
                0,
                0,
                &hHash)) {
        printf("A hash object has been created. \n");
    } else {
        HandleError("Error during CryptCreateHash!\n");
    }
    //--------------------------------------------------------------------
    // 用输入的密码产生一个散列
    if(CryptHashData(
                hHash,
                (BYTE *)szPassword,
                strlen(szPassword),
                0)) {
        printf("The password has been added to the hash. \n");
    } else {
        HandleError("Error during CryptHashData. \n");
    }
    //--------------------------------------------------------------------
    // 通过散列生成会话密钥
    if(CryptDeriveKey(
                hCryptProv,
                ENCRYPT_ALGORITHM,
                hHash,
                KEYLENGTH,
                &hKey)) {
        printf("An encryption key is derived from the password hash. \n");
    } else {
        HandleError("Error during CryptDeriveKey!\n");
    }
    //--------------------------------------------------------------------
    // Destroy the hash object.
    CryptDestroyHash(hHash);
    hHash = NULL;
    //--------------------------------------------------------------------
    //  The session key is now ready.
    //--------------------------------------------------------------------
    // 因为加密算法是按ENCRYPT_BLOCK_SIZE 大小的块加密的,所以被加密的
    // 数据长度必须是ENCRYPT_BLOCK_SIZE 的整数倍。下面计算一次加密的
    // 数据长度。
    dwBlockLen = 1000 - 1000 % ENCRYPT_BLOCK_SIZE;
    //--------------------------------------------------------------------
    // Determine the block size. If a block cipher is used,
    // it must have room for an extra block.
    if(ENCRYPT_BLOCK_SIZE > 1)
        dwBufferLen = dwBlockLen + ENCRYPT_BLOCK_SIZE;
    else
        dwBufferLen = dwBlockLen;
    //--------------------------------------------------------------------
    // Allocate memory.
    if(pbBuffer = (BYTE *)malloc(dwBufferLen)) {
        printf("Memory has been allocated for the buffer. \n");
    } else {
        HandleError("Out of memory. \n");
    }
    //--------------------------------------------------------------------
    // In a do loop, encrypt the source file and write to the source file.
    do {
        //--------------------------------------------------------------------
        // Read up to dwBlockLen bytes from the source file.
        dwCount = fread(pbBuffer, 1, dwBlockLen, hSource);
        if(ferror(hSource)) {
            HandleError("Error reading plaintext!\n");
        }
        //--------------------------------------------------------------------
        // 加密数据
        if(!CryptEncrypt(
                    hKey,           //密钥
                    0,              //如果数据同时进行散列和加密,这里传入一个
                    //散列对象
                    feof(hSource),  //如果是最后一个被加密的块,输入TRUE.如果不是输.
                    //入FALSE这里通过判断是否到文件尾来决定是否为
                    //最后一块。
                    0,              //保留
                    pbBuffer,       //输入被加密数据,输出加密后的数据
                    &dwCount,       //输入被加密数据实际长度,输出加密后数据长度
                    dwBufferLen))   //pbBuffer的大小。
        {
            HandleError("Error during CryptEncrypt. \n");
        }
        //--------------------------------------------------------------------
        // Write data to the destination file.
        fwrite(pbBuffer, 1, dwCount, hDestination);
        if(ferror(hDestination)) {
            HandleError("Error writing ciphertext.");
        }
    } while(!feof(hSource));
    //--------------------------------------------------------------------
    //  End the do loop when the last block of the source file has been
    //  read, encrypted, and written to the destination file.
    //--------------------------------------------------------------------
    // Close files.
    if(hSource)
        fclose(hSource);
    if(hDestination)
        fclose(hDestination);
    //--------------------------------------------------------------------
    // Free memory.
    if(pbBuffer)
        free(pbBuffer);
    //--------------------------------------------------------------------
    // Destroy session key.
    if(hKey)
        CryptDestroyKey(hKey);
    //--------------------------------------------------------------------
    // Destroy hash object.
    if(hHash)
        CryptDestroyHash(hHash);
    //--------------------------------------------------------------------
    // Release provider handle.
    if(hCryptProv)
        CryptReleaseContext(hCryptProv, 0);
    return(TRUE);
} // End of Encryptfile
//--------------------------------------------------------------------
//  This example uses the function HandleError, a simple error
//  handling function, to print an error message to the standard error
//  (stderr) file and exit the program.
//  For most applications, replace this function with one
//  that does more extensive error reporting.
void HandleError(char *s) {
    fprintf(stderr,"An error occurred in running the program. \n");
    fprintf(stderr,"%s\n",s);
    fprintf(stderr, "Error number %x.\n", GetLastError());
    fprintf(stderr, "Program terminating. \n");
    exit(1);
} // End of HandleError

赵4老师 2014-03-24
  • 打赏
  • 举报
回复
#pragma comment(lib, "crypt32.lib")
#pragma comment(lib, "advapi32.lib")
#define _WIN32_WINNT 0x0400
#include <windows.h>
#include <wincrypt.h>
#include <tchar.h>
#include <stdio.h>
#include <stdlib.h>
void HandleError(TCHAR* s);
void Wait(TCHAR* s);
int _tmain(int argc, _TCHAR* argv[]) {
    HCRYPTPROV hProv;
    LPTSTR pszName;
    DWORD dwType;
    DWORD cbName;
    DWORD dwIndex = 0;
    BYTE* ptr;
    ALG_ID aiAlgid;
    DWORD dwBits;
    DWORD dwNameLen;
    CHAR szName[100];
    BYTE pbData[1024];
    DWORD cbData = 1024;
    DWORD dwIncrement = sizeof(DWORD);
    DWORD dwFlags = CRYPT_FIRST;
    DWORD dwParam = PP_CLIENT_HWND;
    CHAR* pszAlgType = NULL;
    BOOL fMore = TRUE;
    printf("列举可用的CSP提供者类型\n");
    printf("CSP提供者类型  CSP提供者类型名称\n");
    _tprintf(TEXT("_____________  __________________________________________________\n"));
    //循环调用CryptEnumProviderType函数枚举当前计算机支持的CSP类型
    while(CryptEnumProviderTypes(dwIndex, NULL, 0,
                                 &dwType,
                                 NULL, //第一次调用设置为NULL
                                 &cbName)) //将要输出的pszName的长度
    {
        //为pszName分配内存
        if(!(pszName = (LPTSTR)LocalAlloc(LMEM_ZEROINIT, cbName))) {
            HandleError(TEXT("调用LocalAlloc分配内存出错\n"));
        }
        //获取CSP提供者类型名
        if(CryptEnumProviderTypes(dwIndex++, NULL, 0,
                                  &dwType, pszName, &cbName)) {
            _tprintf(TEXT("%13d  %s\n"), dwType, pszName);
        } else {
            HandleError(TEXT("调用CryptEnumProviderTypes出错\n"));
        }
        LocalFree(pszName);
    }
    //连接CSP,创建CSP句柄
    if(!CryptAcquireContext(&hProv, NULL, NULL,
                            PROV_RSA_FULL, NULL)) {
        HandleError(TEXT("调用CryptAcquireContext函数出错\n"));
    }
    //获得CSP参数,枚举支持的密码算法
    printf("\n枚举支持的密码算法\n");
    printf("算法ID     位数  类型  长度  算法名称\n");
    printf("_________  ____  ____  ____  ____________________\n");
    while(fMore) {
        if(CryptGetProvParam(hProv, PP_ENUMALGS, pbData,
                             &cbData, dwFlags)) {
            //从pbData缓冲区中解析出算法信息
            dwFlags = 0;
            ptr = pbData;
            aiAlgid = *(ALG_ID*)ptr;
            ptr += sizeof(ALG_ID);
            dwBits = *(DWORD*)ptr;
            ptr += dwIncrement;
            dwNameLen = *(DWORD*)ptr;
            ptr += dwIncrement;
            strncpy(szName, (char*)ptr, __min(dwNameLen,99));szName[__min(dwNameLen,99)]=0;
            //获取算法类型
            switch(GET_ALG_CLASS(aiAlgid)) {
            case ALG_CLASS_DATA_ENCRYPT:
                pszAlgType = "加密";
                break;
            case ALG_CLASS_HASH:
                pszAlgType = "哈希";
                break;
            case ALG_CLASS_KEY_EXCHANGE:
                pszAlgType = "交换";
                break;
            case ALG_CLASS_SIGNATURE:
                pszAlgType = "签名";
                break;
            default:
                pszAlgType = "未知";
                break;
            }
            //打印算法信息
            printf("%8.8xh  %4d  %4s  %4d  %s\n",
                   aiAlgid, dwBits, pszAlgType, dwNameLen, szName);
        } else {
            fMore = FALSE;
        }
    }
    Wait(TEXT("\n按Enter继续"));
    if(!(CryptReleaseContext(hProv, 0))) {
        HandleError(TEXT("调用CryptReleaseContext时出错\n"));
    }
    if(GetLastError() == ERROR_NO_MORE_ITEMS) {
        _tprintf(TEXT("\n程序成功执行完毕\n"));
    } else {
        HandleError(TEXT("读取算法信息时出错"));
    }
    return 0;
}
void HandleError(TCHAR* s) {
    _tprintf(TEXT("程序运行出现错误.\n"));
    _tprintf(TEXT("%s\n"),s);
    _tprintf(TEXT("错误代码%x\n."), GetLastError());
    _tprintf(TEXT("程序终止.\n"));
    exit(1);
}
void Wait(TCHAR* s) {
    char x;
    _tprintf(s);
    x = getchar();
}
//列举可用的CSP提供者类型
//CSP提供者类型  CSP提供者类型名称
//_____________  __________________________________________________
//            1  RSA Full (Signature and Key Exchange)
//            3  DSS Signature
//           12  RSA SChannel
//           13  DSS Signature with Diffie-Hellman Key Exchange
//           18  Diffie-Hellman SChannel
//           24  RSA Full and AES
//
//枚举支持的密码算法
//算法ID     位数  类型  长度  算法名称
//_________  ____  ____  ____  ____________________
//00006602h   128  加密     4  RC2
//00006801h   128  加密     4  RC4
//00006601h    56  加密     4  DES
//00006609h   112  加密    13  3DES TWO KEY
//00006603h   168  加密     5  3DES
//00008004h   160  哈希     6  SHA-1
//00008001h   128  哈希     4  MD2
//00008002h   128  哈希     4  MD4
//00008003h   128  哈希     4  MD5
//00008008h   288  哈希    12  SSL3 SHAMD5
//00008005h     0  哈希     4  MAC
//00002400h  1024  签名     9  RSA_SIGN
//0000a400h  1024  交换     9  RSA_KEYX
//00008009h     0  哈希     5  HMAC
//
//按Enter继续
//
//程序成功执行完毕
//
难题 2014-03-24
  • 打赏
  • 举报
回复
可以随便写一个你进行解密的接口吗,对照函数名我去找找看,最好带上参数啊
华美乐章 2014-03-24
  • 打赏
  • 举报
回复
不是一个厂家 提供的开发接口也不一样啊。 我是以前做这个方面的。几年不搞了, 使用哪家厂商的USBKEY加解密 ,就需要和哪家厂商协商。
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 11 楼 fengqinqdca 的回复:
[quote=引用 9 楼 u013823973 的回复:] [quote=引用 8 楼 fengqinqdca 的回复:] 网银U盾一般里面有一正签名的数字证书。数字证书带有公钥和私钥 USBKEY里面的密钥包括 公钥和私钥。公钥和私钥是匹配的。公钥是可以用厂家的接口函数获取到的,私钥导不出KEY的。 不知道你用的哪个厂商的USBKEY?大明 海泰 中超 华申??
用的飞天的卡,既然私钥导不出,那怎样用私钥加密和解密?[/quote] 向网银的U盾里面就带有一个签名的数字证书。这个签名的数字证书包含公钥和私钥。公钥和私钥是匹配的。 公钥可以导出,用公钥加密,用私钥解密。私钥是在USBKEY里面的 导不出来的。[/quote] 大哥你既然搞了怎么久,有什么文档吗,这个东西文档网上还真少啊,基本找不到相关的 如何可以的话,发到我的邮箱:307345631@qq.com
华美乐章 2014-03-24
  • 打赏
  • 举报
回复
厂家提供的接口进行开发
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 16 楼 fengqinqdca 的回复:
[quote=引用 12 楼 u013823973 的回复:] [quote=引用 11 楼 fengqinqdca 的回复:] [quote=引用 9 楼 u013823973 的回复:] [quote=引用 8 楼 fengqinqdca 的回复:] 网银U盾一般里面有一正签名的数字证书。数字证书带有公钥和私钥 USBKEY里面的密钥包括 公钥和私钥。公钥和私钥是匹配的。公钥是可以用厂家的接口函数获取到的,私钥导不出KEY的。 不知道你用的哪个厂商的USBKEY?大明 海泰 中超 华申??
用的飞天的卡,既然私钥导不出,那怎样用私钥加密和解密?[/quote] 向网银的U盾里面就带有一个签名的数字证书。这个签名的数字证书包含公钥和私钥。公钥和私钥是匹配的。 公钥可以导出,用公钥加密,用私钥解密。私钥是在USBKEY里面的 导不出来的。[/quote] 我现在知道私钥导不出,但是如果我要解密数据的话,我需要得到私钥的句柄才能调用cryptdectypt函数,现在的问题是这样得到私钥的句柄,或则根本就得不到私钥的句柄,那我应该如何解密呢?[/quote] 我用过4家厂商的USBKEY。获取私钥的句柄,这个是不可能的。 你只能找厂家协商 或者去网站上找找关于那个厂家的接口文档[/quote] 那你是如何进行解密的? 还是直接调用厂家提供的接口直接得到?
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 14 楼 zhao4zhong1 的回复:
RSA不知道私钥理论上不可能解密。
我知道RSA的原理啊,就是基于大素数难分解来加密的,就算知道密钥我们也不可能去解密啊,1024位的啊 所以我们自能调用微软的cryptdecrypt函数来解密,问题是CRYPTDECRYPT这个函数的第一个函数需要私钥的句柄才能进行解密,如何得到这个句柄呢? 或者有其他办法来进行解密,不吝赐教啊!~~~~~~
华美乐章 2014-03-24
  • 打赏
  • 举报
回复
引用 12 楼 u013823973 的回复:
[quote=引用 11 楼 fengqinqdca 的回复:] [quote=引用 9 楼 u013823973 的回复:] [quote=引用 8 楼 fengqinqdca 的回复:] 网银U盾一般里面有一正签名的数字证书。数字证书带有公钥和私钥 USBKEY里面的密钥包括 公钥和私钥。公钥和私钥是匹配的。公钥是可以用厂家的接口函数获取到的,私钥导不出KEY的。 不知道你用的哪个厂商的USBKEY?大明 海泰 中超 华申??
用的飞天的卡,既然私钥导不出,那怎样用私钥加密和解密?[/quote] 向网银的U盾里面就带有一个签名的数字证书。这个签名的数字证书包含公钥和私钥。公钥和私钥是匹配的。 公钥可以导出,用公钥加密,用私钥解密。私钥是在USBKEY里面的 导不出来的。[/quote] 我现在知道私钥导不出,但是如果我要解密数据的话,我需要得到私钥的句柄才能调用cryptdectypt函数,现在的问题是这样得到私钥的句柄,或则根本就得不到私钥的句柄,那我应该如何解密呢?[/quote] 我用过4家厂商的USBKEY。获取私钥的句柄,这个是不可能的。 你只能找厂家协商 或者去网站上找找关于那个厂家的接口文档
movsd 2014-03-24
  • 打赏
  • 举报
回复
引用 13 楼 u013823973 的回复:
[quote=引用 10 楼 zhao4zhong1 的回复:] [quote=引用 9 楼 u013823973 的回复:] [quote=引用 8 楼 fengqinqdca 的回复:] 网银U盾一般里面有一正签名的数字证书。数字证书带有公钥和私钥 USBKEY里面的密钥包括 公钥和私钥。公钥和私钥是匹配的。公钥是可以用厂家的接口函数获取到的,私钥导不出KEY的。 不知道你用的哪个厂商的USBKEY?大明 海泰 中超 华申??
用的飞天的卡,既然私钥导不出,那怎样用私钥加密和解密?[/quote] 参考3楼。[/quote] 现在我是要解密啊,该如何解?[/quote] 看这样子,恐怕是无解了,除非USBKEY留有后门。
赵4老师 2014-03-24
  • 打赏
  • 举报
回复
RSA不知道私钥理论上不可能解密。
难题 2014-03-24
  • 打赏
  • 举报
回复
引用 10 楼 zhao4zhong1 的回复:
[quote=引用 9 楼 u013823973 的回复:] [quote=引用 8 楼 fengqinqdca 的回复:] 网银U盾一般里面有一正签名的数字证书。数字证书带有公钥和私钥 USBKEY里面的密钥包括 公钥和私钥。公钥和私钥是匹配的。公钥是可以用厂家的接口函数获取到的,私钥导不出KEY的。 不知道你用的哪个厂商的USBKEY?大明 海泰 中超 华申??
用的飞天的卡,既然私钥导不出,那怎样用私钥加密和解密?[/quote] 参考3楼。[/quote] 现在我是要解密啊,该如何解?
加载更多回复(10)

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧