This library implements some hash and cryptographic algorithms.

Dependents:   mBuinoBlinky PB_Emma_Ethernet SLOTrashHTTP Garagem ... more

This library implements the following algorithms :

  • RC4
  • AES (AES-128, AES-192, AES-256)
  • DES
  • Triple DES (EDE)
  • MD2
  • MD4
  • MD5
  • SHA-1
  • SHA-2 (SHA-224, SHA-256, SHA-384, SHA-512)

The hash algorithms have been optimized for the mbed and you should get decent performance. However, I did not optimize the ciphers. Also, I did not test extensively these algorithms : it should work but you may find some bugs. Block ciphers support two modes : ECB and CBC.

Warning

If you are using SHA-384 or SHA-512, be aware that it produces large binary files and the compilation (using the online compiler) takes much longer to execute. It may happen that the compiler stops because it timed-out. In this case, just compile again and it should work.

Computing hash

You can compute the hash of some data in two different ways. The first one is the easiest, each hash algorithm has a static method that takes some data and compute the hash from it.

Computing hash using method 1

#include "Crypto.h"
#include "mbed.h"

static const char msg[] = "mbed is great !";

int main()
{
    uint8_t hash[16];
    MD2::computeHash(hash, (uint8_t*)msg, strlen(msg));
    printf("hash: ");
    for(int i = 0; i < 16; ++i)
        printf("%02x", hash[i]);
    printf("\n");
    
    return 0;
}

The second one is slightly slower (around 2-3% slower) but it allows you to compute the hash of some data in several steps (by calling update method). This is the method you should use if you need to compute the hash from a large source and you don't have enough memory to store it in a single buffer.

Computing hash using method 2

#include "Crypto.h"
#include "mbed.h"

static const char msg[] = "mbed is great !";

int main()
{
    uint8_t hash[16];
    MD2 h;
    h.update((uint8_t*)msg, strlen(msg));
    h.finalize(hash);
    printf("hash: ");
    for(int i = 0; i < 16; ++i)
        printf("%02x", hash[i]);
    printf("\n");
    
    return 0;
}

TODO

  • optimize ciphers
  • add doc
Committer:
feb11
Date:
Sun May 11 13:36:45 2014 +0000
Revision:
14:f04410cef037
Parent:
8:a090264e9b2d
CBC mode completed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
feb11 5:06cd9c8afa0b 1 #include "DES.h"
feb11 7:2dbbdfb08123 2 #include <string.h>
feb11 7:2dbbdfb08123 3
feb11 7:2dbbdfb08123 4
feb11 7:2dbbdfb08123 5 static const uint8_t S1[] =
feb11 7:2dbbdfb08123 6 {
feb11 7:2dbbdfb08123 7 14, 4, 13, 1, 2, 15, 11, 8, 3, 10, 6, 12, 5, 9, 0, 7,
feb11 7:2dbbdfb08123 8 0, 15, 7, 4, 14, 2, 13, 1, 10, 6, 12, 11, 9, 5, 3, 8,
feb11 7:2dbbdfb08123 9 4, 1, 14, 8, 13, 6, 2, 11, 15, 12, 9, 7, 3, 10, 5, 0,
feb11 7:2dbbdfb08123 10 15, 12, 8, 2, 4, 9, 1, 7, 5, 11, 3, 14, 10, 0, 6, 13
feb11 7:2dbbdfb08123 11 };
feb11 7:2dbbdfb08123 12
feb11 7:2dbbdfb08123 13 static const uint8_t S2[] =
feb11 7:2dbbdfb08123 14 {
feb11 7:2dbbdfb08123 15 15, 1, 8, 14, 6, 11, 3, 4, 9, 7, 2, 13, 12, 0, 5, 10,
feb11 7:2dbbdfb08123 16 3, 13, 4, 7, 15, 2, 8, 14, 12, 0, 1, 10, 6, 9, 11, 5,
feb11 7:2dbbdfb08123 17 0, 14, 7, 11, 10, 4, 13, 1, 5, 8, 12, 6, 9, 3, 2, 15,
feb11 7:2dbbdfb08123 18 13, 8, 10, 1, 3, 15, 4, 2, 11, 6, 7, 12, 0, 5, 14, 9
feb11 7:2dbbdfb08123 19 };
feb11 7:2dbbdfb08123 20
feb11 7:2dbbdfb08123 21 static const uint8_t S3[] =
feb11 7:2dbbdfb08123 22 {
feb11 7:2dbbdfb08123 23 10, 0, 9, 14, 6, 3, 15, 5, 1, 13, 12, 7, 11, 4, 2, 8,
feb11 7:2dbbdfb08123 24 13, 7, 0, 9, 3, 4, 6, 10, 2, 8, 5, 14, 12, 11, 15, 1,
feb11 7:2dbbdfb08123 25 13, 6, 4, 9, 8, 15, 3, 0, 11, 1, 2, 12, 5, 10, 14, 7,
feb11 7:2dbbdfb08123 26 1, 10, 13, 0, 6, 9, 8, 7, 4, 15, 14, 3, 11, 5, 2, 12
feb11 7:2dbbdfb08123 27 };
feb11 7:2dbbdfb08123 28
feb11 7:2dbbdfb08123 29 static const uint8_t S4[] =
feb11 7:2dbbdfb08123 30 {
feb11 7:2dbbdfb08123 31 7, 13, 14, 3, 0, 6, 9, 10, 1, 2, 8, 5, 11, 12, 4, 15,
feb11 7:2dbbdfb08123 32 13, 8, 11, 5, 6, 15, 0, 3, 4, 7, 2, 12, 1, 10, 14, 9,
feb11 7:2dbbdfb08123 33 10, 6, 9, 0, 12, 11, 7, 13, 15, 1, 3, 14, 5, 2, 8, 4,
feb11 7:2dbbdfb08123 34 3, 15, 0, 6, 10, 1, 13, 8, 9, 4, 5, 11, 12, 7, 2, 14
feb11 7:2dbbdfb08123 35 };
feb11 7:2dbbdfb08123 36
feb11 7:2dbbdfb08123 37 static const uint8_t S5[] =
feb11 7:2dbbdfb08123 38 {
feb11 7:2dbbdfb08123 39 2, 12, 4, 1, 7, 10, 11, 6, 8, 5, 3, 15, 13, 0, 14, 9,
feb11 7:2dbbdfb08123 40 14, 11, 2, 12, 4, 7, 13, 1, 5, 0, 15, 10, 3, 9, 8, 6,
feb11 7:2dbbdfb08123 41 4, 2, 1, 11, 10, 13, 7, 8, 15, 9, 12, 5, 6, 3, 0, 14,
feb11 7:2dbbdfb08123 42 11, 8, 12, 7, 1, 14, 2, 13, 6, 15, 0, 9, 10, 4, 5, 3
feb11 7:2dbbdfb08123 43 };
feb11 7:2dbbdfb08123 44
feb11 7:2dbbdfb08123 45 static const uint8_t S6[] =
feb11 7:2dbbdfb08123 46 {
feb11 7:2dbbdfb08123 47 12, 1, 10, 15, 9, 2, 6, 8, 0, 13, 3, 4, 14, 7, 5, 11,
feb11 7:2dbbdfb08123 48 10, 15, 4, 2, 7, 12, 9, 5, 6, 1, 13, 14, 0, 11, 3, 8,
feb11 7:2dbbdfb08123 49 9, 14, 15, 5, 2, 8, 12, 3, 7, 0, 4, 10, 1, 13, 11, 6,
feb11 7:2dbbdfb08123 50 4, 3, 2, 12, 9, 5, 15, 10, 11, 14, 1, 7, 6, 0, 8, 13
feb11 7:2dbbdfb08123 51 };
feb11 7:2dbbdfb08123 52
feb11 7:2dbbdfb08123 53 static const uint8_t S7[] =
feb11 7:2dbbdfb08123 54 {
feb11 7:2dbbdfb08123 55 4, 11, 2, 14, 15, 0, 8, 13, 3, 12, 9, 7, 5, 10, 6, 1,
feb11 7:2dbbdfb08123 56 13, 0, 11, 7, 4, 9, 1, 10, 14, 3, 5, 12, 2, 15, 8, 6,
feb11 7:2dbbdfb08123 57 1, 4, 11, 13, 12, 3, 7, 14, 10, 15, 6, 8, 0, 5, 9, 2,
feb11 7:2dbbdfb08123 58 6, 11, 13, 8, 1, 4, 10, 7, 9, 5, 0, 15, 14, 2, 3, 12
feb11 7:2dbbdfb08123 59 };
feb11 7:2dbbdfb08123 60
feb11 7:2dbbdfb08123 61 static const uint8_t S8[] =
feb11 7:2dbbdfb08123 62 {
feb11 7:2dbbdfb08123 63 13, 2, 8, 4, 6, 15, 11, 1, 10, 9, 3, 14, 5, 0, 12, 7,
feb11 7:2dbbdfb08123 64 1, 15, 13, 8, 10, 3, 7, 4, 12, 5, 6, 11, 0, 14, 9, 2,
feb11 7:2dbbdfb08123 65 7, 11, 4, 1, 9, 12, 14, 2, 0, 6, 10, 13, 15, 3, 5, 8,
feb11 7:2dbbdfb08123 66 2, 1, 14, 7, 4, 10, 8, 13, 15, 12, 9, 0, 3, 5, 6, 11
feb11 7:2dbbdfb08123 67 };
feb11 7:2dbbdfb08123 68
feb11 7:2dbbdfb08123 69 static void pc1(uint8_t *k, uint8_t *key)
feb11 7:2dbbdfb08123 70 {
feb11 7:2dbbdfb08123 71 memset(k, 0, 7);
feb11 7:2dbbdfb08123 72 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 73 {
feb11 7:2dbbdfb08123 74 k[0] = (k[0] << 1) | (key[i] & 0x01);
feb11 7:2dbbdfb08123 75 k[1] = (k[1] << 1) | ((key[i] & 0x02) >> 1);
feb11 7:2dbbdfb08123 76 k[2] = (k[2] << 1) | ((key[i] & 0x04) >> 2);
feb11 7:2dbbdfb08123 77 }
feb11 7:2dbbdfb08123 78 for(int i = 0 ; i < 4; ++i)
feb11 7:2dbbdfb08123 79 {
feb11 7:2dbbdfb08123 80 k[3] = (k[3] << 1) | ((key[4+i] & 0x40) >> 6);
feb11 7:2dbbdfb08123 81 k[4] = (k[4] << 1) | ((key[4+i] & 0x20) >> 5);
feb11 7:2dbbdfb08123 82 k[5] = (k[5] << 1) | ((key[4+i] & 0x10) >> 4);
feb11 7:2dbbdfb08123 83 k[6] = (k[6] << 1) | ((key[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 84 }
feb11 7:2dbbdfb08123 85 for(int i = 0 ; i < 4; ++i)
feb11 7:2dbbdfb08123 86 {
feb11 7:2dbbdfb08123 87 k[3] = (k[3] << 1) | ((key[4+i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 88 k[4] = (k[4] << 1) | ((key[i] & 0x40) >> 6);
feb11 7:2dbbdfb08123 89 k[5] = (k[5] << 1) | ((key[i] & 0x20) >> 5);
feb11 7:2dbbdfb08123 90 k[6] = (k[6] << 1) | ((key[i] & 0x10) >> 4);
feb11 7:2dbbdfb08123 91 }
feb11 7:2dbbdfb08123 92 }
feb11 7:2dbbdfb08123 93
feb11 7:2dbbdfb08123 94 static void leftShift(uint8_t *k)
feb11 7:2dbbdfb08123 95 {
feb11 7:2dbbdfb08123 96 uint8_t tmp = k[0] & 0x01, tmp2 = k[3] & 0x10;
feb11 7:2dbbdfb08123 97 k[0] = (k[0] >> 1) | ((k[1] & 0x01) << 7);
feb11 7:2dbbdfb08123 98 k[1] = (k[1] >> 1) | ((k[2] & 0x01) << 7);
feb11 7:2dbbdfb08123 99 k[2] = (k[2] >> 1) | ((k[3] & 0x01) << 7);
feb11 7:2dbbdfb08123 100
feb11 7:2dbbdfb08123 101 k[3] = ((k[3] & 0x0E) >> 1) | (tmp << 3) | ((k[3] & 0xE0) >> 1) | ((k[4] & 0x01) << 7);
feb11 7:2dbbdfb08123 102
feb11 7:2dbbdfb08123 103 k[4] = (k[4] >> 1) | ((k[5] & 0x01) << 7);
feb11 7:2dbbdfb08123 104 k[5] = (k[5] >> 1) | ((k[6] & 0x01) << 7);
feb11 7:2dbbdfb08123 105 k[6] = (k[6] >> 1) | (tmp2 << 3);
feb11 7:2dbbdfb08123 106
feb11 7:2dbbdfb08123 107 }
feb11 7:2dbbdfb08123 108
feb11 7:2dbbdfb08123 109 void pc2(uint8_t *subKey, uint8_t *k)
feb11 7:2dbbdfb08123 110 {
feb11 7:2dbbdfb08123 111 subKey[0] = ((k[1] & 0x20) >> 5) | ((k[2] & 0x01) << 1) | (k[1] & 0x04) | ((k[2] & 0x80) >> 4) | ((k[0] & 0x01) << 4) | ((k[0] & 0x10) << 1) | ((k[0] & 0x04) << 4) | ((k[3] & 0x08) << 4);
feb11 7:2dbbdfb08123 112 subKey[1] = ((k[1] & 0x40) >> 6) | ((k[0] & 0x20) >> 4) | ((k[2] & 0x10) >> 2) | ((k[1] & 0x02) << 2) | ((k[2] & 0x40) >> 2) | ((k[2] & 0x04) << 3) | ((k[1] & 0x08) << 3) | ((k[0] & 0x08) << 4);
feb11 7:2dbbdfb08123 113 subKey[2] = ((k[3] & 0x02) >> 1) | ((k[0] & 0x80) >> 6) | ((k[1] & 0x80) >> 5) | ((k[0] & 0x40) >> 3) | ((k[3] & 0x04) << 2) | ((k[2] & 0x08) << 2) | ((k[1] & 0x10) << 2) | ((k[0] & 0x02) << 6);
feb11 7:2dbbdfb08123 114 subKey[3] = (k[5] & 0x01) | ((k[6] & 0x08) >> 2) | ((k[3] & 0x40) >> 4) | ((k[4] & 0x10) >> 1) | ((k[5] & 0x40) >> 2) | ((k[6] & 0x40) >> 1) | ((k[3] & 0x20) << 1) | (k[4] & 0x80);
feb11 7:2dbbdfb08123 115 subKey[4] = ((k[6] & 0x04) >> 2) | ((k[5] & 0x10) >> 3) | ((k[4] & 0x01) << 2) | ((k[5] & 0x80) >> 4) | ((k[5] & 0x08) << 1) | ((k[6] & 0x01) << 5) | (k[4] & 0x40) | (k[6] & 0x80);
feb11 7:2dbbdfb08123 116 subKey[5] = ((k[4] & 0x02) >> 1) | ((k[6] & 0x10) >> 3) | ((k[5] & 0x20) >> 3) | ((k[5] & 0x02) << 2) | ((k[6] & 0x02) << 3) | ((k[4] & 0x08) << 2) | ((k[3] & 0x10) << 2) | (k[3] & 0x80);
feb11 7:2dbbdfb08123 117 }
feb11 7:2dbbdfb08123 118
feb11 7:2dbbdfb08123 119
feb11 7:2dbbdfb08123 120 static void initialPermutation(uint8_t *in)
feb11 7:2dbbdfb08123 121 {
feb11 7:2dbbdfb08123 122 uint8_t tmp[8];
feb11 7:2dbbdfb08123 123 memcpy(tmp, in, 8);
feb11 7:2dbbdfb08123 124 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 125 {
feb11 7:2dbbdfb08123 126 tmp[4] = (tmp[4] << 1) | (in[i] & 0x01);
feb11 7:2dbbdfb08123 127 tmp[5] = (tmp[5] << 1) | ((in[i] & 0x04) >> 2);
feb11 7:2dbbdfb08123 128 tmp[6] = (tmp[6] << 1) | ((in[i] & 0x10) >> 4);
feb11 7:2dbbdfb08123 129 tmp[7] = (tmp[7] << 1) | ((in[i] & 0x40) >> 6);
feb11 7:2dbbdfb08123 130
feb11 7:2dbbdfb08123 131 tmp[0] = (tmp[0] << 1) | ((in[i] & 0x02) >> 1);
feb11 7:2dbbdfb08123 132 tmp[1] = (tmp[1] << 1) | ((in[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 133 tmp[2] = (tmp[2] << 1) | ((in[i] & 0x20) >> 5);
feb11 7:2dbbdfb08123 134 tmp[3] = (tmp[3] << 1) | ((in[i] & 0x80) >> 7);
feb11 7:2dbbdfb08123 135 }
feb11 7:2dbbdfb08123 136
feb11 7:2dbbdfb08123 137 memcpy(in, tmp, 8);
feb11 7:2dbbdfb08123 138 }
feb11 7:2dbbdfb08123 139
feb11 7:2dbbdfb08123 140 static void invInitialPermutation(uint8_t *out)
feb11 7:2dbbdfb08123 141 {
feb11 7:2dbbdfb08123 142 uint8_t tmp[8];
feb11 7:2dbbdfb08123 143 memcpy(tmp, out , 8);
feb11 7:2dbbdfb08123 144 for(int i = 3; i >= 0; --i)
feb11 7:2dbbdfb08123 145 {
feb11 7:2dbbdfb08123 146 out[0] = (out[0] << 2) | ((tmp[4+i] & 0x80) >> 7) | ((tmp[i] & 0x80) >> 6);
feb11 7:2dbbdfb08123 147 out[1] = (out[1] << 2) | ((tmp[4+i] & 0x40) >> 6) | ((tmp[i] & 0x40) >> 5);
feb11 7:2dbbdfb08123 148 out[2] = (out[2] << 2) | ((tmp[4+i] & 0x20) >> 5) | ((tmp[i] & 0x20) >> 4);
feb11 7:2dbbdfb08123 149 out[3] = (out[3] << 2) | ((tmp[4+i] & 0x10) >> 4) | ((tmp[i] & 0x10) >> 3);
feb11 7:2dbbdfb08123 150 out[4] = (out[4] << 2) | ((tmp[4+i] & 0x08) >> 3) | ((tmp[i] & 0x08) >> 2);
feb11 7:2dbbdfb08123 151 out[5] = (out[5] << 2) | ((tmp[4+i] & 0x04) >> 2) | ((tmp[i] & 0x04) >> 1);
feb11 7:2dbbdfb08123 152 out[6] = (out[6] << 2) | ((tmp[4+i] & 0x02) >> 1) | (tmp[i] & 0x02);
feb11 7:2dbbdfb08123 153 out[7] = (out[7] << 2) | (tmp[4+i] & 0x01) | ((tmp[i] & 0x01) << 1);
feb11 7:2dbbdfb08123 154 }
feb11 7:2dbbdfb08123 155 }
feb11 7:2dbbdfb08123 156
feb11 7:2dbbdfb08123 157 static void expand(uint8_t *e, uint8_t *r)
feb11 7:2dbbdfb08123 158 {
feb11 7:2dbbdfb08123 159
feb11 7:2dbbdfb08123 160 e[0] = ((r[3] & 0x80) >> 7) | ((r[0] & 0x1F) << 1) | ((r[0] & 0x18) << 3);
feb11 7:2dbbdfb08123 161 e[1] = ((r[0] & 0xE0) >> 5) | ((r[1] & 0x01) << 3) | ((r[0] & 0x80) >> 3) | ((r[1] & 0x07) << 5);
feb11 7:2dbbdfb08123 162 e[2] = ((r[1] & 0x18) >> 3) | ((r[1] & 0xF8) >> 1) | ((r[2] & 0x01) << 7);
feb11 7:2dbbdfb08123 163 e[3] = ((r[1] & 0x80) >> 7) | ((r[2] & 0x1F) << 1) | ((r[2] & 0x18) << 3);
feb11 7:2dbbdfb08123 164 e[4] = ((r[2] & 0xE0) >> 5) | ((r[3] & 0x01) << 3) | ((r[2] & 0x80) >> 3) | ((r[3] & 0x07) << 5);
feb11 7:2dbbdfb08123 165 e[5] = ((r[3] & 0x18) >> 3) | ((r[3] & 0xF8) >> 1) | ((r[0] & 0x01) << 7);
feb11 7:2dbbdfb08123 166
feb11 7:2dbbdfb08123 167 }
feb11 7:2dbbdfb08123 168
feb11 7:2dbbdfb08123 169 static void permutation(uint8_t *r)
feb11 7:2dbbdfb08123 170 {
feb11 7:2dbbdfb08123 171 uint8_t buffer[4];
feb11 7:2dbbdfb08123 172
feb11 7:2dbbdfb08123 173 buffer[0] = ((r[1] & 0x80) >> 7) | ((r[0] & 0x40) >> 5) | ((r[2] & 0x08) >> 1) | ((r[2] & 0x10) >> 1) | (r[3] & 0x10) | ((r[1] & 0x08) << 2) | ((r[3] & 0x08) << 3) | ((r[2] & 0x01) << 7);
feb11 7:2dbbdfb08123 174 buffer[1] = (r[0] & 0x01) | ((r[1] & 0x40) >> 5) | ((r[2] & 0x40) >> 4) | ((r[3] & 0x02) << 2) | (r[0] & 0x10) | ((r[2] & 0x02) << 4) | (r[3] & 0x40) | ((r[1] & 0x02) << 6);
feb11 7:2dbbdfb08123 175 buffer[2] = ((r[0] & 0x02) >> 1) | ((r[0] & 0x80) >> 6) | ((r[2] & 0x80) >> 5) | ((r[1] & 0x20) >> 2) | ((r[3] & 0x80) >> 3) | ((r[3] & 0x04) << 3) | ((r[0] & 0x04) << 4) | ((r[1] & 0x01) << 7);
feb11 7:2dbbdfb08123 176 buffer[3] = ((r[2] & 0x04) >> 2) | ((r[1] & 0x10) >> 3) | ((r[3] & 0x20) >> 3) | ((r[0] & 0x20) >> 2) | ((r[2] & 0x20) >> 1) | ((r[1] & 0x04) << 3) | ((r[0] & 0x08) << 3) | ((r[3] & 0x01) << 7);
feb11 7:2dbbdfb08123 177
feb11 7:2dbbdfb08123 178 memcpy(r, buffer,4);
feb11 7:2dbbdfb08123 179 }
feb11 7:2dbbdfb08123 180
feb11 7:2dbbdfb08123 181 static void substitute(uint8_t *r, uint8_t *e)
feb11 7:2dbbdfb08123 182 {
feb11 7:2dbbdfb08123 183 int index = ((e[0] & 0x01) << 5) | ((e[0] & 0x02) << 2) | (e[0] & 0x04) | ((e[0] & 0x08) >> 2) | ((e[0] & 0x10) >> 4) | ((e[0] & 0x20) >> 1);
feb11 7:2dbbdfb08123 184 int index2 = ((e[0] & 0x40) >> 1) | ((e[0] & 0x80) >> 4) | ((e[1] & 0x01) << 2) | (e[1] & 0x02) | ((e[1] & 0x04) >> 2) | ((e[1] & 0x08) << 1);
feb11 7:2dbbdfb08123 185 r[0] = ((S2[index2] & 0x08) >> 3) | ((S2[index2] & 0x04) >> 1) | ((S2[index2] & 0x02) << 1) | ((S2[index2] & 0x01) << 3);
feb11 7:2dbbdfb08123 186 r[0] <<= 4;
feb11 7:2dbbdfb08123 187 r[0] |= ((S1[index] & 0x08) >> 3) | ((S1[index] & 0x04) >> 1) | ((S1[index] & 0x02) << 1) | ((S1[index] & 0x01) << 3);
feb11 7:2dbbdfb08123 188
feb11 7:2dbbdfb08123 189
feb11 7:2dbbdfb08123 190 index = ((e[1] & 0x10) << 1) | ((e[1] & 0x20) >> 2) | ((e[1] & 0x40) >> 4) | ((e[1] & 0x80) >> 6) | (e[2] & 0x01) | ((e[2] & 0x02) << 3);
feb11 7:2dbbdfb08123 191 index2 = ((e[2] & 0x04) << 3) | (e[2] & 0x08) | ((e[2] & 0x10) >> 2) | ((e[2] & 0x20) >> 4) | ((e[2] & 0x40) >> 6) | ((e[2] & 0x80) >> 3);
feb11 7:2dbbdfb08123 192
feb11 7:2dbbdfb08123 193
feb11 7:2dbbdfb08123 194 r[1] = ((S4[index2] & 0x08) >> 3) | ((S4[index2] & 0x04) >> 1) | ((S4[index2] & 0x02) << 1) | ((S4[index2] & 0x01) << 3);
feb11 7:2dbbdfb08123 195 r[1] <<= 4;
feb11 7:2dbbdfb08123 196 r[1] |= ((S3[index] & 0x08) >> 3) | ((S3[index] & 0x04) >> 1) | ((S3[index] & 0x02) << 1) | ((S3[index] & 0x01) << 3);
feb11 7:2dbbdfb08123 197
feb11 7:2dbbdfb08123 198
feb11 7:2dbbdfb08123 199 index = ((e[3] & 0x01) << 5) | ((e[3] & 0x02) << 2) | (e[3] & 0x04) | ((e[3] & 0x08) >> 2) | ((e[3] & 0x10) >> 4) | ((e[3] & 0x20) >> 1);
feb11 7:2dbbdfb08123 200 index2 = ((e[3] & 0x40) >> 1) | ((e[3] & 0x80) >> 4) | ((e[4] & 0x01) << 2) | (e[4] & 0x02) | ((e[4] & 0x04) >> 2) | ((e[4] & 0x08) << 1);
feb11 7:2dbbdfb08123 201 r[2] = ((S6[index2] & 0x08) >> 3) | ((S6[index2] & 0x04) >> 1) | ((S6[index2] & 0x02) << 1) | ((S6[index2] & 0x01) << 3);
feb11 7:2dbbdfb08123 202 r[2] <<= 4;
feb11 7:2dbbdfb08123 203 r[2] |= ((S5[index] & 0x08) >> 3) | ((S5[index] & 0x04) >> 1) | ((S5[index] & 0x02) << 1) | ((S5[index] & 0x01) << 3);
feb11 7:2dbbdfb08123 204
feb11 7:2dbbdfb08123 205
feb11 7:2dbbdfb08123 206 index = ((e[4] & 0x10) << 1) | ((e[4] & 0x20) >> 2) | ((e[4] & 0x40) >> 4) | ((e[4] & 0x80) >> 6) | (e[5] & 0x01) | ((e[5] & 0x02) << 3);
feb11 7:2dbbdfb08123 207 index2 = ((e[5] & 0x04) << 3) | (e[5] & 0x08) | ((e[5] & 0x10) >> 2) | ((e[5] & 0x20) >> 4) | ((e[5] & 0x40) >> 6) | ((e[5] & 0x80) >> 3);
feb11 7:2dbbdfb08123 208
feb11 7:2dbbdfb08123 209 r[3] = ((S8[index2] & 0x08) >> 3) | ((S8[index2] & 0x04) >> 1) | ((S8[index2] & 0x02) << 1) | ((S8[index2] & 0x01) << 3);
feb11 7:2dbbdfb08123 210 r[3] <<= 4;
feb11 7:2dbbdfb08123 211 r[3] |= ((S7[index] & 0x08) >> 3) | ((S7[index] & 0x04) >> 1) | ((S7[index] & 0x02) << 1) | ((S7[index] & 0x01) << 3);
feb11 7:2dbbdfb08123 212 }
feb11 5:06cd9c8afa0b 213
feb11 5:06cd9c8afa0b 214
feb11 5:06cd9c8afa0b 215 DES::DES(uint8_t *key):
feb11 8:a090264e9b2d 216 BlockCipher(8,ECB_MODE)
feb11 5:06cd9c8afa0b 217 {
feb11 7:2dbbdfb08123 218 generateSubKeys(key);
feb11 5:06cd9c8afa0b 219 }
feb11 5:06cd9c8afa0b 220
feb11 8:a090264e9b2d 221 DES::DES(uint8_t *key, uint8_t *iv):
feb11 8:a090264e9b2d 222 BlockCipher(8,CBC_MODE, iv)
feb11 5:06cd9c8afa0b 223 {
feb11 8:a090264e9b2d 224 generateSubKeys(key);
feb11 5:06cd9c8afa0b 225 }
feb11 5:06cd9c8afa0b 226
feb11 7:2dbbdfb08123 227 void DES::generateSubKeys(uint8_t *key)
feb11 7:2dbbdfb08123 228 {
feb11 7:2dbbdfb08123 229
feb11 7:2dbbdfb08123 230 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 231 key[i] = ((key[i] & 0x01) << 7) | ((key[i] & 0x02) << 5) | ((key[i] & 0x04) << 3) | ((key[i] & 0x08) << 1) | ((key[i] & 0x10) >> 1) | ((key[i] & 0x20) >> 3) | ((key[i] & 0x40) >> 5) | ((key[i] & 0x80) >> 7);
feb11 7:2dbbdfb08123 232
feb11 7:2dbbdfb08123 233 uint8_t workingKey[7];
feb11 7:2dbbdfb08123 234 pc1(workingKey, key);
feb11 7:2dbbdfb08123 235
feb11 7:2dbbdfb08123 236 for(int i = 1; i <= 16; ++i)
feb11 7:2dbbdfb08123 237 {
feb11 7:2dbbdfb08123 238 leftShift(workingKey);
feb11 7:2dbbdfb08123 239 if(i != 9 && i >= 3 && i <=15)
feb11 7:2dbbdfb08123 240 leftShift(workingKey);
feb11 7:2dbbdfb08123 241 pc2(subKeys[i-1], workingKey);
feb11 7:2dbbdfb08123 242 }
feb11 5:06cd9c8afa0b 243 }
feb11 7:2dbbdfb08123 244
feb11 8:a090264e9b2d 245 void DES::encryptBlock(uint8_t *out, uint8_t *in)
feb11 7:2dbbdfb08123 246 {
feb11 7:2dbbdfb08123 247 uint8_t tmp[8];
feb11 7:2dbbdfb08123 248 memcpy(tmp, in, 8);
feb11 7:2dbbdfb08123 249 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 250 tmp[i] = ((tmp[i] & 0x01) << 7) | ((tmp[i] & 0x02) << 5) | ((tmp[i] & 0x04) << 3) | ((tmp[i] & 0x08) << 1) | ((tmp[i] & 0x10) >> 1) | ((tmp[i] & 0x20) >> 3) | ((tmp[i] & 0x40) >> 5) | ((tmp[i] & 0x80) >> 7);
feb11 7:2dbbdfb08123 251
feb11 7:2dbbdfb08123 252
feb11 7:2dbbdfb08123 253 uint8_t l[4], r[4], tmpR[4], e[6];
feb11 7:2dbbdfb08123 254 initialPermutation(tmp);
feb11 7:2dbbdfb08123 255 memcpy(l, tmp, 4);
feb11 7:2dbbdfb08123 256 memcpy(r, &tmp[4], 4);
feb11 7:2dbbdfb08123 257 for(int i = 0; i < 16; ++i)
feb11 7:2dbbdfb08123 258 {
feb11 7:2dbbdfb08123 259 memcpy(tmpR, r, 4);
feb11 7:2dbbdfb08123 260 expand(e, r);
feb11 7:2dbbdfb08123 261 for(int j = 0; j < 6; ++j)
feb11 7:2dbbdfb08123 262 e[j] ^= subKeys[i][j];
feb11 7:2dbbdfb08123 263 substitute(r,e);
feb11 7:2dbbdfb08123 264 permutation(r);
feb11 7:2dbbdfb08123 265 for(int j = 0; j < 4; ++j)
feb11 7:2dbbdfb08123 266 r[j] ^= l[j];
feb11 7:2dbbdfb08123 267
feb11 7:2dbbdfb08123 268 memcpy(l, tmpR, 4);
feb11 7:2dbbdfb08123 269
feb11 7:2dbbdfb08123 270 }
feb11 7:2dbbdfb08123 271 memcpy(tmp, r, 4);
feb11 7:2dbbdfb08123 272 memcpy(&tmp[4], l, 4);
feb11 7:2dbbdfb08123 273
feb11 7:2dbbdfb08123 274 invInitialPermutation(tmp);
feb11 7:2dbbdfb08123 275
feb11 7:2dbbdfb08123 276 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 277 {
feb11 7:2dbbdfb08123 278 out[i] = ((tmp[i] & 0x01) << 3) | ((tmp[i] & 0x02) << 1) | ((tmp[i] & 0x04) >> 1) | ((tmp[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 279 out[i] <<= 4;
feb11 7:2dbbdfb08123 280 tmp[i] >>= 4;
feb11 7:2dbbdfb08123 281 out[i] |= ((tmp[i] & 0x01) << 3) | ((tmp[i] & 0x02) << 1) | ((tmp[i] & 0x04) >> 1) | ((tmp[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 282 }
feb11 7:2dbbdfb08123 283 }
feb11 7:2dbbdfb08123 284
feb11 7:2dbbdfb08123 285
feb11 8:a090264e9b2d 286 void DES::decryptBlock(uint8_t *out, uint8_t *in)
feb11 7:2dbbdfb08123 287 {
feb11 7:2dbbdfb08123 288 uint8_t tmp[8];
feb11 7:2dbbdfb08123 289 memcpy(tmp, in, 8);
feb11 7:2dbbdfb08123 290 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 291 tmp[i] = ((tmp[i] & 0x01) << 7) | ((tmp[i] & 0x02) << 5) | ((tmp[i] & 0x04) << 3) | ((tmp[i] & 0x08) << 1) | ((tmp[i] & 0x10) >> 1) | ((tmp[i] & 0x20) >> 3) | ((tmp[i] & 0x40) >> 5) | ((tmp[i] & 0x80) >> 7);
feb11 7:2dbbdfb08123 292
feb11 7:2dbbdfb08123 293 uint8_t l[4], r[4], tmpL[4], e[6];
feb11 7:2dbbdfb08123 294 initialPermutation(tmp);
feb11 7:2dbbdfb08123 295 memcpy(l, tmp, 4);
feb11 7:2dbbdfb08123 296 memcpy(r, &tmp[4], 4);
feb11 7:2dbbdfb08123 297
feb11 7:2dbbdfb08123 298 for(int i = 15; i >= 0; --i)
feb11 7:2dbbdfb08123 299 {
feb11 7:2dbbdfb08123 300 memcpy(tmpL, r, 4);
feb11 7:2dbbdfb08123 301 expand(e, r);
feb11 7:2dbbdfb08123 302 for(int j = 0; j < 6; ++j)
feb11 7:2dbbdfb08123 303 e[j] ^= subKeys[i][j];
feb11 7:2dbbdfb08123 304 substitute(r,e);
feb11 7:2dbbdfb08123 305 permutation(r);
feb11 7:2dbbdfb08123 306 for(int j = 0; j < 4; ++j)
feb11 7:2dbbdfb08123 307 r[j] ^= l[j];
feb11 7:2dbbdfb08123 308
feb11 7:2dbbdfb08123 309 memcpy(l, tmpL, 4);
feb11 7:2dbbdfb08123 310 }
feb11 7:2dbbdfb08123 311
feb11 7:2dbbdfb08123 312 memcpy(&tmp[4], l, 4);
feb11 7:2dbbdfb08123 313 memcpy(tmp, r, 4);
feb11 7:2dbbdfb08123 314 invInitialPermutation(tmp);
feb11 7:2dbbdfb08123 315
feb11 7:2dbbdfb08123 316
feb11 7:2dbbdfb08123 317 for(int i = 0; i < 8; ++i)
feb11 7:2dbbdfb08123 318 {
feb11 7:2dbbdfb08123 319 out[i] = ((tmp[i] & 0x01) << 3) | ((tmp[i] & 0x02) << 1) | ((tmp[i] & 0x04) >> 1) | ((tmp[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 320 out[i] <<= 4;
feb11 7:2dbbdfb08123 321 tmp[i] >>= 4;
feb11 7:2dbbdfb08123 322 out[i] |= ((tmp[i] & 0x01) << 3) | ((tmp[i] & 0x02) << 1) | ((tmp[i] & 0x04) >> 1) | ((tmp[i] & 0x08) >> 3);
feb11 7:2dbbdfb08123 323 }
feb11 7:2dbbdfb08123 324 }