mirror of
https://github.com/logos-storage/logos-storage-docs-obsidian.git
synced 2026-01-07 15:53:07 +00:00
43 lines
1.7 KiB
Markdown
43 lines
1.7 KiB
Markdown
We show how to use symmetric encryption in BearSSL to encrypt and decrypt the content.
|
|
This is a very basic code demonstrating the use of the BearSSL symmetric encryption API. In [[Codex Encryption Design]] we show a more complete example. In the code below we also use [[BearSSL]] to generate a random number. See [[How to generate a random number using BearSSL]] for more details:
|
|
|
|
```nim
|
|
import std/sequtils
|
|
import bearssl/blockx
|
|
import stew/byteutils
|
|
|
|
import ./rng
|
|
|
|
const
|
|
KeySize = 24 # 192 bits for AES-192
|
|
IvSize = 16 # fixed - 128 bits - notice that the length og the content to be
|
|
# encrypted/decrypted must be multiply of 16
|
|
|
|
var plaintext = "0123456789abcdef".toBytes
|
|
echo "plaintext: ", plaintext.toHex
|
|
|
|
let key = newSeqWith(KeySize, Rng.instance.rand(uint8.high).byte)
|
|
let ive = newSeqWith(IvSize, Rng.instance.rand(uint8.high).byte)
|
|
let ivd = ive
|
|
|
|
echo "ive: ", ive.toHex
|
|
|
|
var encCtx: AesBigCbcencKeys
|
|
aesBigCbcencInit(encCtx, addr key[0], 16.uint)
|
|
aesBigCbcencRun(encCtx, addr ive[0], addr plaintext[0], plaintext.len.uint)
|
|
echo "Encrypted: ", plaintext.toHex
|
|
|
|
echo "ivd: ", ivd.toHex
|
|
|
|
var decCtx: AesBigCbcdecKeys
|
|
aesBigCbcdecInit(decCtx, addr key[0], 16.uint)
|
|
aesBigCbcdecRun(decCtx, addr ivd[0], addr plaintext[0], plaintext.len.uint)
|
|
echo "Decrypted: ", plaintext.toHex
|
|
```
|
|
|
|
As stated in the comment, the following note must be emphasized:
|
|
|
|
>[!note]
|
|
>The size of the `IV` vector must be $16$ bytes long. The data to be encrypted or decrypted must have length that is multiple of $16$
|
|
|
|
Also important to notice is that `aesBigCbcencRun` will mutate the provided initialization vector `IV` so that it is ready to be used for the subsequent chunk of data - a classical CBC mode for AES. |