fffaraz / fffaraz/cppDES

Need for swapping int64 bytes to conform DES

Open
#1 0 comments 2 reactions 0 assignees View on GitHub
Dominant language
C++
Stars
119
Forks
47
PR merge metrics
No merged PRs in 30d

Description

When using encrypting/decrypting a byte array, one has to always swap bytes in int64 to get the conforming result with DES standard.

For instance, consider this DES encryption case
input data: `0011223344556677`
key: `0123456789ABCDEF`
output: `CADB6782EE2B4823 `
(can be verified by http://www.emvlab.org/descalc)

The following code can calculates this output only by performing a swap on the data bytes. Note that all of the **_byteswap_uint64** (or __builtin_bswap64 for gcc) are required. Removing any of them (especially the first two one) leads to incorrect results.

One workaround could be overloading **encrypt** and **decrypt** functions to accept byte arrays and swap the bytes internally. However this can impact the performance.
It would be nice if the internal calculations can be fixed in a way to avoid the need for the swapping the input array bytes.

```
void test_des()
{
// Prepare the key
uint8_t key[8] = { 0x01, 0x23, 0x45, 0x67, 0x89, 0xAB, 0xCD, 0xEF };

uint64_t key_int = *(uint64_t*)key;

key_int = _byteswap_uint64(key_int);

// Generate DES instance
DES des(key_int);

// Prepare the input data
uint8_t data[8] = { 0x00, 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77 };

uint64_t data_int = *(uint64_t*)data;

data_int = _byteswap_uint64(data_int);

// Encrypt
data_int = des.encrypt(data_int);

// Write the result in byte array
uint8_t cipher[8];
data_int = _byteswap_uint64(data_int);
memcpy(cipher, &data_int, 8);
}

```

Contributor guide

No contributing guide indexed for this repository

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.