PRODIGY
На данный момент код такой
Если Вы заметили, там написано, что buff должен быть по длине кратен 16bytes=block size, Вам vertur это в самом начале указывал.
Какой он у Вас?
если не трудно, прикрепите рабочий файл, который вы скомпилировали - я его в отладчике прогоню.
Я на ассемблере не программирую
Могу прикрепить проект на с++
Windows 10, но пока никаких pa3личий с Вашими данными не вижу
Размер структуры 64
Я всё больше склоняюсь к тому, что на моей Win7.1 х32 шифрование AES/GCM просто не реализовано, поскольку даже в хидерах Win8 нет режима "BCRYPT_CHAIN_MODE_GCM"
Согласно документации, этот флаг уже с Vista просто игнорируется
На данный момент код такой
001 | NTSTATUS bcryptResult = 0; |
002 | DWORD bytesDone = 0; |
003 |
004 | // This gets us the AES algorithm: |
005 | BCRYPT_ALG_HANDLE algHandle = 0; |
006 | bcryptResult = BCryptOpenAlgorithmProvider(&algHandle, BCRYPT_AES_ALGORITHM, 0, 0); |
007 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptOpenAlgorithmProvider" ); |
008 |
009 | // This sets up the GCM chaining mode: |
010 | bcryptResult = BCryptSetProperty(algHandle, BCRYPT_CHAINING_MODE, (BYTE*)BCRYPT_CHAIN_MODE_GCM, sizeof(BCRYPT_CHAIN_MODE_GCM), 0); |
011 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptSetProperty(BCRYPT_CHAINING_MODE)" ); |
012 |
013 |
014 | UCHAR ivRandom[12]; |
015 | ULONG ivRandomSize = 12; |
016 | bcryptResult = BCryptGenRandom(0, ivRandom, ivRandomSize, BCRYPT_USE_SYSTEM_PREFERRED_RNG); |
017 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptGenRandom" ); |
018 |
019 | UCHAR keyRandom[32]; |
020 | ULONG keyRandomSize = 32; |
021 | bcryptResult = BCryptGenRandom(0, keyRandom, keyRandomSize, BCRYPT_USE_SYSTEM_PREFERRED_RNG); |
022 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptGenRandom" ); |
023 |
024 | BCRYPT_KEY_HANDLE keyHandle = 0; |
025 | bcryptResult = BCryptGenerateSymmetricKey(algHandle, &keyHandle, 0, 0, keyRandom, keyRandomSize, 0); |
026 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptGenerateSymmetricKey" ); |
027 |
028 |
029 | UCHAR namebuff[256]; |
030 | ULONG tempSize = 256; // We ignore this because we know the buffer is big enough. |
031 | const WCHAR* name = ( const WCHAR*)namebuff; |
032 | bcryptResult = BCryptGetProperty(algHandle, BCRYPT_ALGORITHM_NAME, namebuff, sizeof(namebuff), &tempSize, 0); |
033 | std::cout << "Obtained algorithm name: " ; |
034 | std::wcout << name << std::endl; |
035 |
036 | bcryptResult = BCryptGetProperty(algHandle, BCRYPT_CHAINING_MODE, namebuff, sizeof(namebuff), &tempSize, 0); |
037 | std::cout << "Obtained chaining mode: " ; |
038 | std::wcout << name << std::endl; // Outputs: ChainingModeGCM |
039 |
040 | const size_t GCM_NONCE_SIZE = 12; |
041 | const std::vector<BYTE> origNonce = { 0,0,0,0,0,0,0,0,0,0,0,0 }; |
042 |
043 | std::cout << "Nonce: " ; |
044 | printB64((BYTE*)&origNonce[0], origNonce.size()); |
045 |
046 | // This needs to be a multiple of the block size (128 bits/16 bytes) for Windows CNG. Our example is 128 bytes in ASCII (16 * 8 = 128) |
047 | std::string plaintext( "ABSDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz01234567809AB" ); |
048 | const std::vector<BYTE> plaintextVector(plaintext.data(), plaintext.data() + plaintext.length()); |
049 |
050 |
051 | // This tells us the length of the authentication tag: |
052 | BCRYPT_AUTH_TAG_LENGTHS_STRUCT authTagLengths; |
053 | bcryptResult = BCryptGetProperty(algHandle, BCRYPT_AUTH_TAG_LENGTH, (BYTE*)&authTagLengths, sizeof(authTagLengths), &bytesDone, 0); |
054 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptGetProperty(BCRYPT_AUTH_TAG_LENGTH)" ); |
055 |
056 | std::cout << "Auth Tag Length (min): " << authTagLengths.dwMinLength << std::endl; |
057 | std::cout << "Auth Tag Length (max): " << authTagLengths.dwMaxLength << std::endl; |
058 |
059 | // We are going to do in-place encryption: |
060 | std::vector<BYTE> buff = plaintextVector; |
061 | std::vector<BYTE> authTag(authTagLengths.dwMaxLength); |
062 | std::string text = "Prodigy12345" ; |
063 | std::vector<BYTE> authDataProdigy(text.data(), text.data() + text.length()); |
064 |
065 |
066 | // This sets up our nonce and GCM authentication tag parameters: |
067 | BCRYPT_AUTHENTICATED_CIPHER_MODE_INFO authInfo; |
068 | BCRYPT_INIT_AUTH_MODE_INFO(authInfo); |
069 | authInfo.pbNonce = (PUCHAR)&origNonce[0]; |
070 | authInfo.cbNonce = origNonce.size(); |
071 | authInfo.pbTag = &authTag[0]; |
072 | authInfo.cbTag = authTag.size(); |
073 | authInfo.pbAuthData = &authDataProdigy[0]; |
074 | authInfo.cbAuthData = authDataProdigy.size(); |
075 |
076 | std::cout << "Plaintext (" << plaintext.length() << " bytes): " << plaintext << std::endl; |
077 |
078 | bcryptResult = BCryptEncrypt( |
079 | keyHandle, |
080 | &buff[0], buff.size(), |
081 | &authInfo, |
082 | (PUCHAR)&ivRandom[0], 12, |
083 | &buff[0], buff.size(), |
084 | &bytesDone, 0 |
085 | ); |
086 |
087 | std::cout << "AES-128/GCM(16) ciphertext: " ; |
088 | printB64((BYTE*)&buff[0], buff.size()); |
089 |
090 | std::cout << "Auth Tag: " ; |
091 | printB64((BYTE*)&authTag[0], authTag.size()); |
092 |
093 | assert(BCRYPT_SUCCESS(bcryptResult) || ! "BCryptEncrypt" ); |
094 | assert(bytesDone == buff.size()); |
095 |
096 | // Cleanup |
097 | BCryptDestroyKey(keyHandle); |
098 | BCryptCloseAlgorithmProvider(algHandle, 0); |
099 |
100 | std::getchar(); |
Добавление от 25.06.2021 16:13:
PRODIGYЕсли Вы заметили, там написано, что buff должен быть по длине кратен 16bytes=block size, Вам vertur это в самом начале указывал.
Какой он у Вас?
Добавление от 25.06.2021 16:20:
PRODIGYесли не трудно, прикрепите рабочий файл, который вы скомпилировали - я его в отладчике прогоню.
Я на ассемблере не программирую
Могу прикрепить проект на с++
Windows 10, но пока никаких pa3личий с Вашими данными не вижу
Размер структуры 64
Добавление от 25.06.2021 16:25:
PRODIGYЯ всё больше склоняюсь к тому, что на моей Win7.1 х32 шифрование AES/GCM просто не реализовано, поскольку даже в хидерах Win8 нет режима "BCRYPT_CHAIN_MODE_GCM"
Согласно документации, этот флаг уже с Vista просто игнорируется
Исправлено: Lucy, 25.06.2021 17:51
К сообщению приложены файлы: