Win32加密大小相同

时间:2013-04-30 09:18:44

标签: c++ winapi encryption public-key-encryption

我想加密一个15字节的数组。问题是我希望密文具有相同的大小。

我做了什么

  1. 制作证书: makecert.exe -n“CN = me”-sv PrivateKey.pvk -pe Certificate.cer
  2. 编写此代码以导入证书,然后加密纯文本。

    BYTE    FileContent[1024];
    DWORD   dwActualFileLen = 0;
    HANDLE  hCertFile;
    if(CryptAcquireContext(&m_hCryptProv, NULL, MS_ENHANCED_PROV, PROV_RSA_FULL, 0))
    {
    hCertFile = CreateFileA("C:\\projects\\Certificate.cer", 
         GENERIC_READ,
         FILE_SHARE_READ, 
         NULL, 
         OPEN_EXISTING,
         FILE_FLAG_SEQUENTIAL_SCAN,
         NULL);
    
    ReadFile(hCertFile, FileContent, 1024, &dwActualFileLen, NULL);
    
    m_CertContext = CertCreateCertificateContext(X509_ASN_ENCODING, FileContent, dwActualFileLen);
    
    CryptImportPublicKeyInfo(m_hCryptProv, X509_ASN_ENCODING, &m_CertContext->pCertInfo->SubjectPublicKeyInfo, &m_hPubKey);
    }
    
    CryptEncrypt(m_hPubKey, NULL, TRUE, 0, tempBuffer, &dwNewLen, 128);
    
  3. 密文总是128字节。我想强制它与纯文本的大小相同。

2 个答案:

答案 0 :(得分:2)

RSA算法不能输出任意大小的密文。你必须忍受这个。由于你的RSA keylen似乎是1024位(128字节),输入和输出大小总是128字节,等于RSA keylen的大小......

答案 1 :(得分:1)

太复杂了。使用15字节密钥对输入字符串进行异或。这被称为One Time Pad,可证明是100%安全的。解密与加密相同,(a XOR b) XOR b = a适用于所有a和b,(a XOR b) XOR c = a当且仅当b = c。