1

我正在使用“wincrypt.h”来基于算法来加密字符串,然后将加密的字符串解密为原始字符串。

就像是 :

Original -> Encrypt -> Decrypt -> Original

问题是在某些情况下(某些单词),解密的原件长度很短,问题不是我检查过的字符串长度或一个或多个相关字符。我认为问题在于密钥(它只是一个随机字符串),如果我使用不同的密钥,它会影响完全不同的单词/字符串。

这是代码:

    BOOL SetupCryptoClient()
    {
        // Ensure that the default cryptographic client is set up.  
        HCRYPTPROV hProv;
        HCRYPTKEY hKey;     
        // Attempt to acquire a handle to the default key container.
        if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, 0))  
        {
            // Some sort of error occured, create default key container.
            if (!CryptAcquireContext(&hProv, NULL, MS_DEF_PROV, PROV_RSA_FULL, CRYPT_NEWKEYSET))
            {   
                // Error creating key container!            
                return FALSE;       
            }   
        }
        // Attempt to get handle to signature key.
        if (!CryptGetUserKey(hProv, AT_SIGNATURE, &hKey))   
        {
            if (GetLastError() == NTE_NO_KEY)       
            {           
                // Create signature key pair.
                if (!CryptGenKey(hProv, AT_SIGNATURE, 0, &hKey))            
                {
                    // Error during CryptGenKey!                
                    CryptReleaseContext(hProv, 0);
                    return FALSE;           
                }           
                else            
                {               
                    CryptDestroyKey(hKey);          
                }       
            }       
            else        
            {
                // Error during CryptGetUserKey!            
                CryptReleaseContext(hProv, 0);
                return FALSE;       
            }   
        }

        // Attempt to get handle to exchange key.
        if (!CryptGetUserKey(hProv,AT_KEYEXCHANGE,&hKey))   
        {
            if (GetLastError()==NTE_NO_KEY)     
            {           
                // Create key exchange key pair.
                if (!CryptGenKey(hProv,AT_KEYEXCHANGE,0,&hKey))         
                {
                    // Error during CryptGenKey!                
                    CryptReleaseContext(hProv, 0);
                    return FALSE;           
                }           
                else            
                {               
                    CryptDestroyKey(hKey);          
                }       
            }       
            else        
            {
                // Error during CryptGetUserKey!            
                CryptReleaseContext(hProv, 0);
                return FALSE;       
            }   
        }   

        CryptReleaseContext(hProv, 0);  
        return TRUE;
    }



    BOOL EncryptString(TCHAR* szPassword,TCHAR* szEncryptPwd,TCHAR *szKey)
    {   
        BOOL bResult = TRUE;    
        HKEY hRegKey = NULL;    
        HCRYPTPROV hProv;   
        HCRYPTKEY hKey;
        HCRYPTKEY hXchgKey; 
        HCRYPTHASH hHash;   
        DWORD dwLength;
        // Get handle to user default provider.
        if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))  
        {
            // Create hash object.      
            if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))     
            {
                // Hash password string.            
                dwLength = sizeof(TCHAR)*_tcslen(szKey);
                if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0))           
                {
                    // Create block cipher session key based on hash of the password.
                    if (CryptDeriveKey(hProv, MY_ENCRYPT, hHash, CRYPT_EXPORTABLE, &hKey))              
                    {
                        // Determine number of bytes to encrypt at a time.
                        dwLength = sizeof(TCHAR)*_tcslen(szPassword);                   
                        // Allocate memory.
                        BYTE *pbBuffer = (BYTE *)malloc(dwLength);                  
                        if (pbBuffer != NULL)                   
                        {
                            memcpy(pbBuffer, szPassword, dwLength);                     
                            // Encrypt data
                            if (CryptEncrypt(hKey, 0, TRUE, 0, pbBuffer, &dwLength, dwLength))                      
                            {
                                // return encrypted string
                                memcpy(szEncryptPwd, pbBuffer, dwLength);

                            }   
                            else                        
                            {                           
                                bResult = FALSE;                        
                            }                       
                            // Free memory
                            free(pbBuffer);                 
                        }
                        else                    
                        {                       
                            bResult = FALSE;                    
                        }
                        CryptDestroyKey(hKey);  // Release provider handle.             
                    }               
                    else                
                    {
                        // Error during CryptDeriveKey!                 
                        bResult = FALSE;                
                    }           
                }           
                else            
                {
                    // Error during CryptHashData!              
                    bResult = FALSE;            
                }
                CryptDestroyHash(hHash); 
                // Destroy session key.     
            }       
            else        
            {
                // Error during CryptCreateHash!            
                bResult = FALSE;        
            }
            CryptReleaseContext(hProv, 0);  
        }   
        return bResult;
    }



    BOOL DecryptString(TCHAR* szEncryptPwd,TCHAR* szPassword,TCHAR *szKey) 
    {   
        BOOL bResult = TRUE;    
        HCRYPTPROV hProv;       
        HCRYPTKEY hKey;     
        HCRYPTKEY hXchgKey;
        HCRYPTHASH hHash;
        TCHAR szPasswordTemp[32] = _T("");
        DWORD dwLength;
        // Get handle to user default provider.
        if (CryptAcquireContext(&hProv, NULL, NULL, PROV_RSA_FULL, 0))      
        {
            // Create hash object.          
            if (CryptCreateHash(hProv, CALG_MD5, 0, 0, &hHash))
            {               
                // Hash password string.
                dwLength = sizeof(TCHAR)*_tcslen(szKey);
                if (CryptHashData(hHash, (BYTE *)szKey, dwLength, 0))               
                {
                    // Create block cipher session key based on hash of the password.
                    if (CryptDeriveKey(
                        hProv, MY_ENCRYPT, hHash, CRYPT_EXPORTABLE, &hKey))                 
                    {
                        // we know the encrypted password and the length
                        dwLength = sizeof(TCHAR)*_tcslen(szEncryptPwd);                     
                        // copy encrypted password to temporary TCHAR
                        _tcscpy(szPasswordTemp,szEncryptPwd);
                        if (!CryptDecrypt(
                                hKey, 0, TRUE, 0, (BYTE *)szPasswordTemp, &dwLength))
                            bResult = FALSE;                        
                        CryptDestroyKey(hKey);  // Release provider handle.                 
                        // copy decrypted password to outparameter
                        _tcscpy(szPassword,szPasswordTemp);
                    }                   
                    else                    
                    {
                        // Error during CryptDeriveKey!                     
                        bResult = FALSE;                    
                    }               
                }               
                else
                {                   
                    // Error during CryptHashData!                  
                    bResult = FALSE;                
                }
                CryptDestroyHash(hHash); // Destroy session key.            
            }           
            else            
            {
                // Error during CryptCreateHash!                
                bResult = FALSE;            
            }
            CryptReleaseContext(hProv, 0);      
        }       
        return bResult;
    }

这就是我所说的:

TCHAR szEncrypt[32] = _T("");
EncryptString( myString, szEncrypt, szKey );

TCHAR szDecrypt[32] = _T("");
DecryptString( szEncrypt, szDecrypt, szKey);

注意:代码不是我的。

编辑:使用键“Mz6@a0i*”将 Kolaris 转换为 Kolari

4

1 回答 1

1

加密的字符串可以包含一个零字节,实际上任何单个字节为零的机会是 1/256。您假设加密结果是一个以零字节结尾的字符串。即使 TCHAR 是 16 位而不是 8 位,您的机会仍然是 1/65536。

您需要传递加密结果的长度。

于 2012-12-11T19:51:15.910 回答