1# Encryption and Decryption with a DES Symmetric Key (ECB Mode) (C/C++) 2 3<!--Kit: Crypto Architecture Kit--> 4<!--Subsystem: Security--> 5<!--Owner: @zxz--3--> 6<!--Designer: @lanming--> 7<!--Tester: @PAFT--> 8<!--Adviser: @zengyawen--> 9 10For details about the algorithm specifications, see [DES](crypto-sym-encrypt-decrypt-spec.md#des). 11 12## Adding the Dynamic Library in the CMake Script 13```txt 14target_link_libraries(entry PUBLIC libohcrypto.so) 15``` 16 17## How to Develop 18 19**Creating an Object** 20 21Call [OH_CryptoSymKeyGenerator_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-key-h.md#oh_cryptosymkeygenerator_create) and [OH_CryptoSymKeyGenerator_Generate](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-key-h.md#oh_cryptosymkeygenerator_generate) to generate a symmetric key (**OH_CryptoSymKey**) with the key algorithm being DES and the key length being 64 bits. 22 23 In addition to the example in this topic, [DES](crypto-sym-key-generation-conversion-spec.md#des) and [Converting Binary Data into a Symmetric Key](crypto-convert-binary-data-to-sym-key-ndk.md) may help you better understand how to generate a DES symmetric key pair. Note that the input parameters in the reference documents may be different from those in the example below. 24 25**Encryption** 26 271. Call [OH_CryptoSymCipher_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_create) with the string parameter **'DES64|ECB|PKCS7'** to create a **Cipher** instance for encryption. The key type is **DES64**, block cipher mode is **ECB**, and the padding mode is **PKCS7**. 28 292. Call [OH_CryptoSymCipher_Init](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_init) to initialize the **Cipher** instance. Specifically, set **mode** to **CRYPTO_ENCRYPT_MODE**, and specify the key for encryption (**OH_CryptoSymKey**). 30 31 If ECB mode is used, set **params** to **null**. 32 333. Call [OH_CryptoSymCipher_Update](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_update) to update data (in plaintext). 34 35 - If a small amount of data is to be encrypted, you can use **OH_CryptoSymCipher_Final()** immediately after **OH_CryptoSymCipher_Init()**. 36 - If a large amount of data is to be encrypted, you can call **OH_CryptoSymCipher_Update** multiple times to pass in the data by segment. 37 384. Call [OH_CryptoSymCipher_Final](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_final) to obtain the encrypted data. 39 40 - If **OH_CryptoSymCipher_Update** is used to pass in data, set **data** to **null**. If **OH_CryptoSymCipher_Final** is used to pass in data, pass in the plaintext via **data**. 41 - The output of **OH_CryptoSymCipher_Final** may be **null**. To avoid exceptions, always check whether the result is **null** before accessing specific data. 42 43**Decryption** 44 451. Call [OH_CryptoSymCipher_Create](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_create) with the string parameter **'DES64|ECB|PKCS7'** to create a **Cipher** instance for decryption. The key type is **DES64**, block cipher mode is **ECB**, and the padding mode is **PKCS7**. 46 472. Call [OH_CryptoSymCipher_Init](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_init) to initialize the **Cipher** instance. Specifically, set **mode** to **CRYPTO_DECRYPT_MODE**, and specify the key for decryption (**OH_CryptoSymKey**). If ECB mode is used, pass in **null**. 48 493. Call [OH_CryptoSymCipher_Update](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_update) to update data (in ciphertext). 50 51 - If a small amount of data is to be encrypted, you can use **OH_CryptoSymCipher_Final()** immediately after **OH_CryptoSymCipher_Init()**. 52 - If a large amount of data is to be encrypted, you can call **OH_CryptoSymCipher_Update** multiple times to pass in the data by segment. 53 - You can determine the method to use based on the data size. For example, if the data size is greater than 20 bytes, use **OH_CryptoSymCipher_Update**. 54 554. Call [OH_CryptoSymCipher_Final](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_final) to obtain the decrypted data. 56 57 - If **OH_CryptoSymCipher_Update** is used to pass in data, set **data** to **null**. If **OH_CryptoSymCipher_Final** is used to pass in data, pass in the ciphertext via **data**. 58 - The output of **OH_CryptoSymCipher_Final** may be **null**. To avoid exceptions, always check whether the result is **null** before accessing specific data. 59 60**Destroying Objects** 61 62Call [OH_CryptoSymKeyGenerator_Destroy](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-key-h.md#oh_cryptosymkeygenerator_destroy), [OH_CryptoSymCipher_Destroy](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-cipher-h.md#oh_cryptosymcipher_destroy), [OH_CryptoSymKey_Destroy](../../reference/apis-crypto-architecture-kit/capi-crypto-sym-key-h.md#oh_cryptosymkey_destroy), and [OH_Crypto_FreeDataBlob](../../reference/apis-crypto-architecture-kit/capi-crypto-common-h.md#oh_crypto_freedatablob) to release the allocated memory and destroy the object. 63 64```c++ 65#include "CryptoArchitectureKit/crypto_common.h" 66#include "CryptoArchitectureKit/crypto_sym_cipher.h" 67#include <string.h> 68 69static OH_Crypto_ErrCode doTestDesEcb() 70{ 71 OH_CryptoSymKeyGenerator *genCtx = nullptr; 72 OH_CryptoSymCipher *encCtx = nullptr; 73 OH_CryptoSymCipher *decCtx = nullptr; 74 OH_CryptoSymKey *keyCtx = nullptr; 75 char *plainText = const_cast<char *>("this is test!"); 76 Crypto_DataBlob input = {.data = (uint8_t *)(plainText), .len = strlen(plainText)}; 77 Crypto_DataBlob encData = {.data = nullptr, .len = 0}; 78 Crypto_DataBlob decData = {.data = nullptr, .len = 0}; 79 80 // Generate a symmetric key randomly. 81 OH_Crypto_ErrCode ret; 82 ret = OH_CryptoSymKeyGenerator_Create("DES64", &genCtx); 83 if (ret != CRYPTO_SUCCESS) { 84 goto end; 85 } 86 ret = OH_CryptoSymKeyGenerator_Generate(genCtx, &keyCtx); 87 if (ret != CRYPTO_SUCCESS) { 88 goto end; 89 } 90 91 // Encrypt the message. 92 ret = OH_CryptoSymCipher_Create("DES64|ECB|PKCS7", &encCtx); 93 if (ret != CRYPTO_SUCCESS) { 94 goto end; 95 } 96 ret = OH_CryptoSymCipher_Init(encCtx, CRYPTO_ENCRYPT_MODE, keyCtx, nullptr); 97 if (ret != CRYPTO_SUCCESS) { 98 goto end; 99 } 100 ret = OH_CryptoSymCipher_Final(encCtx, &input, &encData); 101 if (ret != CRYPTO_SUCCESS) { 102 goto end; 103 } 104 105 // Decrypt the message. 106 ret = OH_CryptoSymCipher_Create("DES64|ECB|PKCS7", &decCtx); 107 if (ret != CRYPTO_SUCCESS) { 108 goto end; 109 } 110 ret = OH_CryptoSymCipher_Init(decCtx, CRYPTO_DECRYPT_MODE, keyCtx, nullptr); 111 if (ret != CRYPTO_SUCCESS) { 112 goto end; 113 } 114 ret = OH_CryptoSymCipher_Final(decCtx, &encData, &decData); 115 if (ret != CRYPTO_SUCCESS) { 116 goto end; 117 } 118 119end: 120 OH_CryptoSymCipher_Destroy(encCtx); 121 OH_CryptoSymCipher_Destroy(decCtx); 122 OH_CryptoSymKeyGenerator_Destroy(genCtx); 123 OH_CryptoSymKey_Destroy(keyCtx); 124 OH_Crypto_FreeDataBlob(&encData); 125 OH_Crypto_FreeDataBlob(&decData); 126 return ret; 127} 128``` 129