我们有一个C ++应用程序,它通过openssl API( EVP_EncryptInit_ex,EVP_EncryptUpdate,EVP_EncryptFinal_ex )使用AES算法对密码进行加密。
现在,我尝试开发UWP应用程序,通过该应用程序我想与上述旧版应用程序进行相同的身份验证。
但是,当我使用“ Windows.Security.Cryptography” 中的API时,由于加密的数据输出与旧版应用程序不同,因此我的身份验证失败,因此解密也将通过身份验证失败。 >
旧版应用程序使用一个密钥和初始化向量,并且在我的UWP应用程序中也使用了相同的初始化向量。旧版应用程序使用密码模式CBC,我在UWP中使用了“ AesCbcPKCS7” ,但加密输出是不同的。
我还尝试了“ AesCbc” ,并根据PKCS7填充手动填充了数据,但加密的输出是不同的,并且身份验证失败。
请帮助解决上述问题。
一些旧版应用程序代码API流程示例:
EVP_CIPHER_CTX_init(&ctx);
EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
EVP_EncryptUpdate(&ctx, output, &nOutputSize, input, strlen((const char *)input)+1);
EVP_EncryptFinal_ex(&ctx, output + nOutputSize, &nTmplen);
EVP_CIPHER_CTX_cleanup(&ctx);
下面的UWP代码示例:
IBuffer iBuf = CryptographicBuffer.ConvertStringToBinary(strPwd, BinaryStringEncoding.Utf8);
IBuffer iPubKey = CryptographicBuffer.CreateFromByteArray(PUB_KEY);
SymmetricKeyAlgorithmProvider objAlg = SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithmNames.AesCbcPkcs7);
CryptographicKey cryptKey = objAlg.CreateSymmetricKey(iPubKey);
IBuffer iv = CryptographicBuffer.CreateFromByteArray(INIT_VECTOR);
IBuffer encryptPwd = CryptographicEngine.Encrypt(cryptKey, iBuf, iv);
string strEncPwd = CryptographicBuffer.EncodeToBase64String(encryptPwd);