• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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