Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/129.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 私钥解密代码使用BSAFE库v6.0的公共接口说明符?_C++_Cryptography_Rsa - Fatal编程技术网

C++ 私钥解密代码使用BSAFE库v6.0的公共接口说明符?

C++ 私钥解密代码使用BSAFE库v6.0的公共接口说明符?,c++,cryptography,rsa,C++,Cryptography,Rsa,我最近被指派负责升级一段非常旧的密码,它将不再在Windows10下运行。我升级到Visual Studio 2013,并对代码进行了一些修改,以使用更好的错误报告。代码运行良好。它使用私钥对加密数据进行解密。一切都很好 除了当我注意到代码中有一条注释指出某些公共说明符必须用作BSAFE v6.0库例程的输入,而不是它们的私有对应项时。事实上,当使用私有说明符时,我会收到以下错误消息: RSA错误:密钥信息格式无效 注意:我的私钥未加密 我不明白为什么私有说明符不起作用,因为我在做私钥解密 在下

我最近被指派负责升级一段非常旧的密码,它将不再在Windows10下运行。我升级到Visual Studio 2013,并对代码进行了一些修改,以使用更好的错误报告。代码运行良好。它使用私钥对加密数据进行解密。一切都很好

除了当我注意到代码中有一条注释指出某些公共说明符必须用作BSAFE v6.0库例程的输入,而不是它们的私有对应项时。事实上,当使用私有说明符时,我会收到以下错误消息:

RSA错误:密钥信息格式无效

注意:我的私钥未加密

我不明白为什么私有说明符不起作用,因为我在做私钥解密

在下面的代码中,BSAFE v6.0库函数是B_SetKeyInfo、B_GetKeyInfo和B_SetAlgorithmInfo使用公钥说明符

int Decrypt(unsigned char* cypherData, const string privKeyFilePathAndName, unsigned char*& plainData) {

enum { 
    IN_BUF_LEN                  = 1000, // input buffer length
    NUM_DIGITAL_SIGNATURE_BYTES = 128   // number of digital signature bytes
}; 

static unsigned char decryptedDigest[NUM_DIGITAL_SIGNATURE_BYTES]; // decrypted digest (returned)

const string delimiters = " \n"; // strtok delimeters

A_RSA_KEY       privKey;                             // private key
B_ALGORITHM_OBJ rsaAlgorithmObj;                     // rsa algorithm object
B_KEY_OBJ       privKeyObject;                       // private key object
char            inBuf[IN_BUF_LEN];                   // input buffer
char*           token;                               // strtok token
FILE*           ifp;                                 // input (private key) file pointer
int             i;                                   // index
int             stat;                                // status
unsigned char   privModulusData[NUM_MODULUS_BYTES];  // modulus data
unsigned char   privExponentData[NUM_MODULUS_BYTES]; // exponent data
unsigned int    digestLen;                           // digest length
unsigned int    partOutLen;                          // part out length

// open private key file
if ((ifp = fopen(privKeyFilePathAndName.c_str(), "r")) == NULL) {
    DisplayErrorMsg("Can't open private key file");
    return FAIL;
}

// get modulus length and exponent length
if ((fgets(inBuf, IN_BUF_LEN, ifp)) == NULL) {
    DisplayErrorMsg("Private key file error - can't read number of modulus bytes (modulus length)");
    return FAIL;
}
privKey.modulus.len = privKey.exponent.len = stoi(inBuf);

// get modulus data
if ((fgets(inBuf, IN_BUF_LEN, ifp)) == NULL) {
    DisplayErrorMsg("Private key file error - can't read modulus data");
    return FAIL;
}
token = strtok(inBuf, delimiters.c_str());
for (i = 0; token; i++) {
    privModulusData[i] = (unsigned char) stoi(token);
    token = strtok(NULL, delimiters.c_str());
}
if (i != sizeof(privModulusData)) {
    DisplayErrorMsg("Private key file error - wrong amount of modulus data");
    return FAIL;
}

// get exponent data
if ((fgets(inBuf, IN_BUF_LEN, ifp)) == NULL) {
    DisplayErrorMsg("Private key file error - can't read exponent data");
    return FAIL;
}
token = strtok(inBuf, delimiters.c_str());
for (i = 0; token; i++) {
    privExponentData[i] = (unsigned char) stoi(token);
    token = strtok(NULL, delimiters.c_str());
}
if (i != sizeof(privExponentData)) {
    DisplayErrorMsg("Private key file error - wrong amount of exponent data");
    return FAIL;
}

// close private key file and finish creating private key variable
fclose(ifp);
privKey.modulus.data = privModulusData;
privKey.exponent.data = privExponentData;

// create private key object and set to key read in from file
if ((stat = B_CreateKeyObject(&privKeyObject)) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}

// the private key is set to an Infotype of KI_RSAPublic because an error is 
// generated during decryption if we use the Infotype KI_RSAPrivate; not sure 
// why it works this way
if ((stat = B_SetKeyInfo(privKeyObject, KI_RSAPublic, (POINTER)&privKey)) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}
if ((stat = B_GetKeyInfo((POINTER *)&privKey, privKeyObject, KI_RSAPublic)) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}

// create an rsa algorithm object and set algorithm infoType to RSAPublic
if ((stat = B_CreateAlgorithmObject(&rsaAlgorithmObj)) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}
if ((stat = B_SetAlgorithmInfo(rsaAlgorithmObj, AI_RSAPublic, NULL_PTR)) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}

// perform the decryption, in stages (initial, update, and final)
if ((stat = B_DecryptInit(rsaAlgorithmObj, privKeyObject, DEMO_ALGORITHM_CHOOSER, ((A_SURRENDER_CTX*)NULL_PTR))) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}
if ((stat = B_DecryptUpdate(rsaAlgorithmObj, decryptedDigest, &digestLen, sizeof(decryptedDigest), cypherData, NUM_DIGITAL_SIGNATURE_BYTES, (B_ALGORITHM_OBJ)NULL_PTR, ((A_SURRENDER_CTX*)NULL_PTR))) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}
if ((stat = B_DecryptFinal(rsaAlgorithmObj, decryptedDigest, &partOutLen, sizeof(decryptedDigest), (B_ALGORITHM_OBJ)NULL_PTR, ((A_SURRENDER_CTX*)NULL_PTR))) != 0) {
    DisplayRsaErrorMsg(stat);
    return FAIL;
}

// set returned pointer and return pass code
plainData = decryptedDigest;
return PASS;

}

RSA BSAFE Crypto-C 5.2库参考手册指出,不建议使用KI_RSAPrivate。与RSA私钥一起使用的适当KIs是KI_PKCS_RSAPrivate和KI_PKCS_RSAPrivateBER。请参阅。

“我升级到Visual Studio 2013”-哇,如果一个7年的编译器算是升级,那一定是一些非常陈旧且未维护的代码。但是,你为什么要停下来?为什么不在使用VS 2019和C++17时使用它呢?RSA BSAFE Crypto-C 5.2库参考手册指出,不建议使用KI_RSAPrivate。与RSA私钥一起使用的适当KIs是KI_PKCS_RSAPrivate和KI_PKCS_RSAPrivateBER。请参阅:@JesperJuhl,我的公司在一些项目上使用Visual Studio的更高版本,但这个特定项目已经使用Visual 2013多年了。@framontb,谢谢。当我使用您指定的私钥参数时,它可以工作。再次感谢,很好!那我就把答案贴出来