├── Encrypt.v ├── ProcessKey.v ├── README.md └── Test.v /Encrypt.v: -------------------------------------------------------------------------------- 1 | 2 | module Encrypt(output reg [64:1] ciphertext, input [64:1] message, input [64:1] key); 3 | 4 | function [64:1] perm_IP_inverse(input [64:1] message); 5 | integer IP_inverse[64:1]; 6 | reg [64:1] temp_msg; 7 | integer i; 8 | begin 9 | IP_inverse[1] = 40; 10 | IP_inverse[2] = 8; 11 | IP_inverse[3] = 48; 12 | IP_inverse[4] = 16; 13 | IP_inverse[5] = 56; 14 | IP_inverse[6] = 24; 15 | IP_inverse[7] = 64; 16 | IP_inverse[8] = 32; 17 | IP_inverse[9] = 39; 18 | IP_inverse[10] = 7; 19 | IP_inverse[11] = 47; 20 | IP_inverse[12] = 15; 21 | IP_inverse[13] = 55; 22 | IP_inverse[14] = 23; 23 | IP_inverse[15] = 63; 24 | IP_inverse[16] = 31; 25 | IP_inverse[17] = 38; 26 | IP_inverse[18] = 6; 27 | IP_inverse[19] = 46; 28 | IP_inverse[20] = 14; 29 | IP_inverse[21] = 54; 30 | IP_inverse[22] = 22; 31 | IP_inverse[23] = 62; 32 | IP_inverse[24] = 30; 33 | IP_inverse[25] = 37; 34 | IP_inverse[26] = 5; 35 | IP_inverse[27] = 45; 36 | IP_inverse[28] = 13; 37 | IP_inverse[29] = 53; 38 | IP_inverse[30] = 21; 39 | IP_inverse[31] = 61; 40 | IP_inverse[32] = 29; 41 | IP_inverse[33] = 36; 42 | IP_inverse[34] = 4; 43 | IP_inverse[35] = 44; 44 | IP_inverse[36] = 12; 45 | IP_inverse[37] = 52; 46 | IP_inverse[38] = 20; 47 | IP_inverse[39] = 60; 48 | IP_inverse[40] = 28; 49 | IP_inverse[41] = 35; 50 | IP_inverse[42] = 3; 51 | IP_inverse[43] = 43; 52 | IP_inverse[44] = 11; 53 | IP_inverse[45] = 51; 54 | IP_inverse[46] = 19; 55 | IP_inverse[47] = 59; 56 | IP_inverse[48] = 27; 57 | IP_inverse[49] = 34; 58 | IP_inverse[50] = 2; 59 | IP_inverse[51] = 42; 60 | IP_inverse[52] = 10; 61 | IP_inverse[53] = 50; 62 | IP_inverse[54] = 18; 63 | IP_inverse[55] = 58; 64 | IP_inverse[56] = 26; 65 | IP_inverse[57] = 33; 66 | IP_inverse[58] = 1; 67 | IP_inverse[59] = 41; 68 | IP_inverse[60] = 9; 69 | IP_inverse[61] = 49; 70 | IP_inverse[62] = 17; 71 | IP_inverse[63] = 57; 72 | IP_inverse[64] = 25; 73 | 74 | for(i=1; i<=64; i=i+1) 75 | temp_msg[64-i+1] = message[64-IP_inverse[i]+1]; 76 | perm_IP_inverse = temp_msg; 77 | end 78 | endfunction 79 | 80 | function [64:1] perm_IP(input [64:1] message); 81 | integer IP[64:1]; 82 | reg [64:1] temp_msg; 83 | integer i; 84 | begin 85 | IP[1] = 58; 86 | IP[2] = 50; 87 | IP[3] = 42; 88 | IP[4] = 34; 89 | IP[5] = 26; 90 | IP[6] = 18; 91 | IP[7] = 10; 92 | IP[8] = 2; 93 | IP[9] = 60; 94 | IP[10] = 52; 95 | IP[11] = 44; 96 | IP[12] = 36; 97 | IP[13] = 28; 98 | IP[14] = 20; 99 | IP[15] = 12; 100 | IP[16] = 4; 101 | IP[17] = 62; 102 | IP[18] = 54; 103 | IP[19] = 46; 104 | IP[20] = 38; 105 | IP[21] = 30; 106 | IP[22] = 22; 107 | IP[23] = 14; 108 | IP[24] = 6; 109 | IP[25] = 64; 110 | IP[26] = 56; 111 | IP[27] = 48; 112 | IP[28] = 40; 113 | IP[29] = 32; 114 | IP[30] = 24; 115 | IP[31] = 16; 116 | IP[32] = 8; 117 | IP[33] = 57; 118 | IP[34] = 49; 119 | IP[35] = 41; 120 | IP[36] = 33; 121 | IP[37] = 25; 122 | IP[38] = 17; 123 | IP[39] = 9; 124 | IP[40] = 1; 125 | IP[41] = 59; 126 | IP[42] = 51; 127 | IP[43] = 43; 128 | IP[44] = 35; 129 | IP[45] = 27; 130 | IP[46] = 19; 131 | IP[47] = 11; 132 | IP[48] = 3; 133 | IP[49] = 61; 134 | IP[50] = 53; 135 | IP[51] = 45; 136 | IP[52] = 37; 137 | IP[53] = 29; 138 | IP[54] = 21; 139 | IP[55] = 13; 140 | IP[56] = 5; 141 | IP[57] = 63; 142 | IP[58] = 55; 143 | IP[59] = 47; 144 | IP[60] = 39; 145 | IP[61] = 31; 146 | IP[62] = 23; 147 | IP[63] = 15; 148 | IP[64] = 7; 149 | 150 | for(i=1; i<=64; i=i+1) 151 | temp_msg[64-i+1] = message[64-IP[i]+1]; 152 | perm_IP = temp_msg; 153 | end 154 | endfunction 155 | 156 | function [48:1] perm_E(input [32:1] R); 157 | integer E[48:1]; 158 | reg [48:1] temp_E; 159 | integer i; 160 | begin 161 | 162 | E[1] = 32; 163 | E[2] = 1; 164 | E[3] = 2; 165 | E[4] = 3; 166 | E[5] = 4; 167 | E[6] = 5; 168 | E[7] = 4; 169 | E[8] = 5; 170 | E[9] = 6; 171 | E[10] = 7; 172 | E[11] = 8; 173 | E[12] = 9; 174 | E[13] = 8; 175 | E[14] = 9; 176 | E[15] = 10; 177 | E[16] = 11; 178 | E[17] = 12; 179 | E[18] = 13; 180 | E[19] = 12; 181 | E[20] = 13; 182 | E[21] = 14; 183 | E[22] = 15; 184 | E[23] = 16; 185 | E[24] = 17; 186 | E[25] = 16; 187 | E[26] = 17; 188 | E[27] = 18; 189 | E[28] = 19; 190 | E[29] = 20; 191 | E[30] = 21; 192 | E[31] = 20; 193 | E[32] = 21; 194 | E[33] = 22; 195 | E[34] = 23; 196 | E[35] = 24; 197 | E[36] = 25; 198 | E[37] = 24; 199 | E[38] = 25; 200 | E[39] = 26; 201 | E[40] = 27; 202 | E[41] = 28; 203 | E[42] = 29; 204 | E[43] = 28; 205 | E[44] = 29; 206 | E[45] = 30; 207 | E[46] = 31; 208 | E[47] = 32; 209 | E[48] = 1; 210 | 211 | for(i=1; i<=48; i=i+1) 212 | temp_E[48-i+1] = R[32-E[i]+1]; 213 | 214 | perm_E = temp_E; 215 | end 216 | endfunction 217 | 218 | 219 | function [32:1] perm_P(input [32:1] s_res); 220 | integer i; 221 | integer P[32:1]; 222 | reg [32:1] temp_P; 223 | begin 224 | P[1] = 16; 225 | P[2] = 7; 226 | P[3] = 20; 227 | P[4] = 21; 228 | P[5] = 29; 229 | P[6] = 12; 230 | P[7] = 28; 231 | P[8] = 17; 232 | P[9] = 1; 233 | P[10] = 15; 234 | P[11] = 23; 235 | P[12] = 26; 236 | P[13] = 5; 237 | P[14] = 18; 238 | P[15] = 31; 239 | P[16] = 10; 240 | P[17] = 2; 241 | P[18] = 8; 242 | P[19] = 24; 243 | P[20] = 14; 244 | P[21] = 32; 245 | P[22] = 27; 246 | P[23] = 3; 247 | P[24] = 9; 248 | P[25] = 19; 249 | P[26] = 13; 250 | P[27] = 30; 251 | P[28] = 6; 252 | P[29] = 22; 253 | P[30] = 11; 254 | P[31] = 4; 255 | P[32] = 25; 256 | 257 | for(i=1; i<=32; i=i+1) 258 | temp_P[32-i+1] = s_res[32-P[i]+1]; 259 | perm_P = temp_P; 260 | end 261 | endfunction 262 | 263 | 264 | function [4:1] SBOX(input [6:1] B, input reg [4:0] s_table_id); 265 | reg [2:1] i; 266 | reg [4:1] j; 267 | reg [3:0] S1[3:0][15:0]; 268 | reg [3:0] S2[3:0][15:0]; 269 | reg [3:0] S3[3:0][15:0]; 270 | reg [3:0] S4[3:0][15:0]; 271 | reg [3:0] S5[3:0][15:0]; 272 | reg [3:0] S6[3:0][15:0]; 273 | reg [3:0] S7[3:0][15:0]; 274 | reg [3:0] S8[3:0][15:0]; 275 | begin 276 | S1[0][0] = 14; 277 | S1[0][1] = 4; 278 | S1[0][2] = 13; 279 | S1[0][3] = 1; 280 | S1[0][4] = 2; 281 | S1[0][5] = 15; 282 | S1[0][6] = 11; 283 | S1[0][7] = 8; 284 | S1[0][8] = 3; 285 | S1[0][9] = 10; 286 | S1[0][10] = 6; 287 | S1[0][11] = 12; 288 | S1[0][12] = 5; 289 | S1[0][13] = 9; 290 | S1[0][14] = 0; 291 | S1[0][15] = 7; 292 | S1[1][0] = 0; 293 | S1[1][1] = 15; 294 | S1[1][2] = 7; 295 | S1[1][3] = 4; 296 | S1[1][4] = 14; 297 | S1[1][5] = 2; 298 | S1[1][6] = 13; 299 | S1[1][7] = 1; 300 | S1[1][8] = 10; 301 | S1[1][9] = 6; 302 | S1[1][10] = 12; 303 | S1[1][11] = 11; 304 | S1[1][12] = 9; 305 | S1[1][13] = 5; 306 | S1[1][14] = 3; 307 | S1[1][15] = 8; 308 | S1[2][0] = 4; 309 | S1[2][1] = 1; 310 | S1[2][2] = 14; 311 | S1[2][3] = 8; 312 | S1[2][4] = 13; 313 | S1[2][5] = 6; 314 | S1[2][6] = 2; 315 | S1[2][7] = 11; 316 | S1[2][8] = 15; 317 | S1[2][9] = 12; 318 | S1[2][10] = 9; 319 | S1[2][11] = 7; 320 | S1[2][12] = 3; 321 | S1[2][13] = 10; 322 | S1[2][14] = 5; 323 | S1[2][15] = 0; 324 | S1[3][0] = 15; 325 | S1[3][1] = 12; 326 | S1[3][2] = 8; 327 | S1[3][3] = 2; 328 | S1[3][4] = 4; 329 | S1[3][5] = 9; 330 | S1[3][6] = 1; 331 | S1[3][7] = 7; 332 | S1[3][8] = 5; 333 | S1[3][9] = 11; 334 | S1[3][10] = 3; 335 | S1[3][11] = 14; 336 | S1[3][12] = 10; 337 | S1[3][13] = 0; 338 | S1[3][14] = 6; 339 | S1[3][15] = 13; 340 | S2[0][0] = 15; 341 | S2[0][1] = 1; 342 | S2[0][2] = 8; 343 | S2[0][3] = 14; 344 | S2[0][4] = 6; 345 | S2[0][5] = 11; 346 | S2[0][6] = 3; 347 | S2[0][7] = 4; 348 | S2[0][8] = 9; 349 | S2[0][9] = 7; 350 | S2[0][10] = 2; 351 | S2[0][11] = 13; 352 | S2[0][12] = 12; 353 | S2[0][13] = 0; 354 | S2[0][14] = 5; 355 | S2[0][15] = 10; 356 | S2[1][0] = 3; 357 | S2[1][1] = 13; 358 | S2[1][2] = 4; 359 | S2[1][3] = 7; 360 | S2[1][4] = 15; 361 | S2[1][5] = 2; 362 | S2[1][6] = 8; 363 | S2[1][7] = 14; 364 | S2[1][8] = 12; 365 | S2[1][9] = 0; 366 | S2[1][10] = 1; 367 | S2[1][11] = 10; 368 | S2[1][12] = 6; 369 | S2[1][13] = 9; 370 | S2[1][14] = 11; 371 | S2[1][15] = 5; 372 | S2[2][0] = 0; 373 | S2[2][1] = 14; 374 | S2[2][2] = 7; 375 | S2[2][3] = 11; 376 | S2[2][4] = 10; 377 | S2[2][5] = 4; 378 | S2[2][6] = 13; 379 | S2[2][7] = 1; 380 | S2[2][8] = 5; 381 | S2[2][9] = 8; 382 | S2[2][10] = 12; 383 | S2[2][11] = 6; 384 | S2[2][12] = 9; 385 | S2[2][13] = 3; 386 | S2[2][14] = 2; 387 | S2[2][15] = 15; 388 | S2[3][0] = 13; 389 | S2[3][1] = 8; 390 | S2[3][2] = 10; 391 | S2[3][3] = 1; 392 | S2[3][4] = 3; 393 | S2[3][5] = 15; 394 | S2[3][6] = 4; 395 | S2[3][7] = 2; 396 | S2[3][8] = 11; 397 | S2[3][9] = 6; 398 | S2[3][10] = 7; 399 | S2[3][11] = 12; 400 | S2[3][12] = 0; 401 | S2[3][13] = 5; 402 | S2[3][14] = 14; 403 | S2[3][15] = 9; 404 | S3[0][0] = 10; 405 | S3[0][1] = 0; 406 | S3[0][2] = 9; 407 | S3[0][3] = 14; 408 | S3[0][4] = 6; 409 | S3[0][5] = 3; 410 | S3[0][6] = 15; 411 | S3[0][7] = 5; 412 | S3[0][8] = 1; 413 | S3[0][9] = 13; 414 | S3[0][10] = 12; 415 | S3[0][11] = 7; 416 | S3[0][12] = 11; 417 | S3[0][13] = 4; 418 | S3[0][14] = 2; 419 | S3[0][15] = 8; 420 | S3[1][0] = 13; 421 | S3[1][1] = 7; 422 | S3[1][2] = 0; 423 | S3[1][3] = 9; 424 | S3[1][4] = 3; 425 | S3[1][5] = 4; 426 | S3[1][6] = 6; 427 | S3[1][7] = 10; 428 | S3[1][8] = 2; 429 | S3[1][9] = 8; 430 | S3[1][10] = 5; 431 | S3[1][11] = 14; 432 | S3[1][12] = 12; 433 | S3[1][13] = 11; 434 | S3[1][14] = 15; 435 | S3[1][15] = 1; 436 | S3[2][0] = 13; 437 | S3[2][1] = 6; 438 | S3[2][2] = 4; 439 | S3[2][3] = 9; 440 | S3[2][4] = 8; 441 | S3[2][5] = 15; 442 | S3[2][6] = 3; 443 | S3[2][7] = 0; 444 | S3[2][8] = 11; 445 | S3[2][9] = 1; 446 | S3[2][10] = 2; 447 | S3[2][11] = 12; 448 | S3[2][12] = 5; 449 | S3[2][13] = 10; 450 | S3[2][14] = 14; 451 | S3[2][15] = 7; 452 | S3[3][0] = 1; 453 | S3[3][1] = 10; 454 | S3[3][2] = 13; 455 | S3[3][3] = 0; 456 | S3[3][4] = 6; 457 | S3[3][5] = 9; 458 | S3[3][6] = 8; 459 | S3[3][7] = 7; 460 | S3[3][8] = 4; 461 | S3[3][9] = 15; 462 | S3[3][10] = 14; 463 | S3[3][11] = 3; 464 | S3[3][12] = 11; 465 | S3[3][13] = 5; 466 | S3[3][14] = 2; 467 | S3[3][15] = 12; 468 | S4[0][0] = 7; 469 | S4[0][1] = 13; 470 | S4[0][2] = 14; 471 | S4[0][3] = 3; 472 | S4[0][4] = 0; 473 | S4[0][5] = 6; 474 | S4[0][6] = 9; 475 | S4[0][7] = 10; 476 | S4[0][8] = 1; 477 | S4[0][9] = 2; 478 | S4[0][10] = 8; 479 | S4[0][11] = 5; 480 | S4[0][12] = 11; 481 | S4[0][13] = 12; 482 | S4[0][14] = 4; 483 | S4[0][15] = 15; 484 | S4[1][0] = 13; 485 | S4[1][1] = 8; 486 | S4[1][2] = 11; 487 | S4[1][3] = 5; 488 | S4[1][4] = 6; 489 | S4[1][5] = 15; 490 | S4[1][6] = 0; 491 | S4[1][7] = 3; 492 | S4[1][8] = 4; 493 | S4[1][9] = 7; 494 | S4[1][10] = 2; 495 | S4[1][11] = 12; 496 | S4[1][12] = 1; 497 | S4[1][13] = 10; 498 | S4[1][14] = 14; 499 | S4[1][15] = 9; 500 | S4[2][0] = 10; 501 | S4[2][1] = 6; 502 | S4[2][2] = 9; 503 | S4[2][3] = 0; 504 | S4[2][4] = 12; 505 | S4[2][5] = 11; 506 | S4[2][6] = 7; 507 | S4[2][7] = 13; 508 | S4[2][8] = 15; 509 | S4[2][9] = 1; 510 | S4[2][10] = 3; 511 | S4[2][11] = 14; 512 | S4[2][12] = 5; 513 | S4[2][13] = 2; 514 | S4[2][14] = 8; 515 | S4[2][15] = 4; 516 | S4[3][0] = 3; 517 | S4[3][1] = 15; 518 | S4[3][2] = 0; 519 | S4[3][3] = 6; 520 | S4[3][4] = 10; 521 | S4[3][5] = 1; 522 | S4[3][6] = 13; 523 | S4[3][7] = 8; 524 | S4[3][8] = 9; 525 | S4[3][9] = 4; 526 | S4[3][10] = 5; 527 | S4[3][11] = 11; 528 | S4[3][12] = 12; 529 | S4[3][13] = 7; 530 | S4[3][14] = 2; 531 | S4[3][15] = 14; 532 | S5[0][0] = 2; 533 | S5[0][1] = 12; 534 | S5[0][2] = 4; 535 | S5[0][3] = 1; 536 | S5[0][4] = 7; 537 | S5[0][5] = 10; 538 | S5[0][6] = 11; 539 | S5[0][7] = 6; 540 | S5[0][8] = 8; 541 | S5[0][9] = 5; 542 | S5[0][10] = 3; 543 | S5[0][11] = 15; 544 | S5[0][12] = 13; 545 | S5[0][13] = 0; 546 | S5[0][14] = 14; 547 | S5[0][15] = 9; 548 | S5[1][0] = 14; 549 | S5[1][1] = 11; 550 | S5[1][2] = 2; 551 | S5[1][3] = 12; 552 | S5[1][4] = 4; 553 | S5[1][5] = 7; 554 | S5[1][6] = 13; 555 | S5[1][7] = 1; 556 | S5[1][8] = 5; 557 | S5[1][9] = 0; 558 | S5[1][10] = 15; 559 | S5[1][11] = 10; 560 | S5[1][12] = 3; 561 | S5[1][13] = 9; 562 | S5[1][14] = 8; 563 | S5[1][15] = 6; 564 | S5[2][0] = 4; 565 | S5[2][1] = 2; 566 | S5[2][2] = 1; 567 | S5[2][3] = 11; 568 | S5[2][4] = 10; 569 | S5[2][5] = 13; 570 | S5[2][6] = 7; 571 | S5[2][7] = 8; 572 | S5[2][8] = 15; 573 | S5[2][9] = 9; 574 | S5[2][10] = 12; 575 | S5[2][11] = 5; 576 | S5[2][12] = 6; 577 | S5[2][13] = 3; 578 | S5[2][14] = 0; 579 | S5[2][15] = 14; 580 | S5[3][0] = 11; 581 | S5[3][1] = 8; 582 | S5[3][2] = 12; 583 | S5[3][3] = 7; 584 | S5[3][4] = 1; 585 | S5[3][5] = 14; 586 | S5[3][6] = 2; 587 | S5[3][7] = 13; 588 | S5[3][8] = 6; 589 | S5[3][9] = 15; 590 | S5[3][10] = 0; 591 | S5[3][11] = 9; 592 | S5[3][12] = 10; 593 | S5[3][13] = 4; 594 | S5[3][14] = 5; 595 | S5[3][15] = 3; 596 | S6[0][0] = 12; 597 | S6[0][1] = 1; 598 | S6[0][2] = 10; 599 | S6[0][3] = 15; 600 | S6[0][4] = 9; 601 | S6[0][5] = 2; 602 | S6[0][6] = 6; 603 | S6[0][7] = 8; 604 | S6[0][8] = 0; 605 | S6[0][9] = 13; 606 | S6[0][10] = 3; 607 | S6[0][11] = 4; 608 | S6[0][12] = 14; 609 | S6[0][13] = 7; 610 | S6[0][14] = 5; 611 | S6[0][15] = 11; 612 | S6[1][0] = 10; 613 | S6[1][1] = 15; 614 | S6[1][2] = 4; 615 | S6[1][3] = 2; 616 | S6[1][4] = 7; 617 | S6[1][5] = 12; 618 | S6[1][6] = 9; 619 | S6[1][7] = 5; 620 | S6[1][8] = 6; 621 | S6[1][9] = 1; 622 | S6[1][10] = 13; 623 | S6[1][11] = 14; 624 | S6[1][12] = 0; 625 | S6[1][13] = 11; 626 | S6[1][14] = 3; 627 | S6[1][15] = 8; 628 | S6[2][0] = 9; 629 | S6[2][1] = 14; 630 | S6[2][2] = 15; 631 | S6[2][3] = 5; 632 | S6[2][4] = 2; 633 | S6[2][5] = 8; 634 | S6[2][6] = 12; 635 | S6[2][7] = 3; 636 | S6[2][8] = 7; 637 | S6[2][9] = 0; 638 | S6[2][10] = 4; 639 | S6[2][11] = 10; 640 | S6[2][12] = 1; 641 | S6[2][13] = 13; 642 | S6[2][14] = 11; 643 | S6[2][15] = 6; 644 | S6[3][0] = 4; 645 | S6[3][1] = 3; 646 | S6[3][2] = 2; 647 | S6[3][3] = 12; 648 | S6[3][4] = 9; 649 | S6[3][5] = 5; 650 | S6[3][6] = 15; 651 | S6[3][7] = 10; 652 | S6[3][8] = 11; 653 | S6[3][9] = 14; 654 | S6[3][10] = 1; 655 | S6[3][11] = 7; 656 | S6[3][12] = 6; 657 | S6[3][13] = 0; 658 | S6[3][14] = 8; 659 | S6[3][15] = 13; 660 | S7[0][0] = 4; 661 | S7[0][1] = 11; 662 | S7[0][2] = 2; 663 | S7[0][3] = 14; 664 | S7[0][4] = 15; 665 | S7[0][5] = 0; 666 | S7[0][6] = 8; 667 | S7[0][7] = 13; 668 | S7[0][8] = 3; 669 | S7[0][9] = 12; 670 | S7[0][10] = 9; 671 | S7[0][11] = 7; 672 | S7[0][12] = 5; 673 | S7[0][13] = 10; 674 | S7[0][14] = 6; 675 | S7[0][15] = 1; 676 | S7[1][0] = 13; 677 | S7[1][1] = 0; 678 | S7[1][2] = 11; 679 | S7[1][3] = 7; 680 | S7[1][4] = 4; 681 | S7[1][5] = 9; 682 | S7[1][6] = 1; 683 | S7[1][7] = 10; 684 | S7[1][8] = 14; 685 | S7[1][9] = 3; 686 | S7[1][10] = 5; 687 | S7[1][11] = 12; 688 | S7[1][12] = 2; 689 | S7[1][13] = 15; 690 | S7[1][14] = 8; 691 | S7[1][15] = 6; 692 | S7[2][0] = 1; 693 | S7[2][1] = 4; 694 | S7[2][2] = 11; 695 | S7[2][3] = 13; 696 | S7[2][4] = 12; 697 | S7[2][5] = 3; 698 | S7[2][6] = 7; 699 | S7[2][7] = 14; 700 | S7[2][8] = 10; 701 | S7[2][9] = 15; 702 | S7[2][10] = 6; 703 | S7[2][11] = 8; 704 | S7[2][12] = 0; 705 | S7[2][13] = 5; 706 | S7[2][14] = 9; 707 | S7[2][15] = 2; 708 | S7[3][0] = 6; 709 | S7[3][1] = 11; 710 | S7[3][2] = 13; 711 | S7[3][3] = 8; 712 | S7[3][4] = 1; 713 | S7[3][5] = 4; 714 | S7[3][6] = 10; 715 | S7[3][7] = 7; 716 | S7[3][8] = 9; 717 | S7[3][9] = 5; 718 | S7[3][10] = 0; 719 | S7[3][11] = 15; 720 | S7[3][12] = 14; 721 | S7[3][13] = 2; 722 | S7[3][14] = 3; 723 | S7[3][15] = 12; 724 | S8[0][0] = 13; 725 | S8[0][1] = 2; 726 | S8[0][2] = 8; 727 | S8[0][3] = 4; 728 | S8[0][4] = 6; 729 | S8[0][5] = 15; 730 | S8[0][6] = 11; 731 | S8[0][7] = 1; 732 | S8[0][8] = 10; 733 | S8[0][9] = 9; 734 | S8[0][10] = 3; 735 | S8[0][11] = 14; 736 | S8[0][12] = 5; 737 | S8[0][13] = 0; 738 | S8[0][14] = 12; 739 | S8[0][15] = 7; 740 | S8[1][0] = 1; 741 | S8[1][1] = 15; 742 | S8[1][2] = 13; 743 | S8[1][3] = 8; 744 | S8[1][4] = 10; 745 | S8[1][5] = 3; 746 | S8[1][6] = 7; 747 | S8[1][7] = 4; 748 | S8[1][8] = 12; 749 | S8[1][9] = 5; 750 | S8[1][10] = 6; 751 | S8[1][11] = 11; 752 | S8[1][12] = 0; 753 | S8[1][13] = 14; 754 | S8[1][14] = 9; 755 | S8[1][15] = 2; 756 | S8[2][0] = 7; 757 | S8[2][1] = 11; 758 | S8[2][2] = 4; 759 | S8[2][3] = 1; 760 | S8[2][4] = 9; 761 | S8[2][5] = 12; 762 | S8[2][6] = 14; 763 | S8[2][7] = 2; 764 | S8[2][8] = 0; 765 | S8[2][9] = 6; 766 | S8[2][10] = 10; 767 | S8[2][11] = 13; 768 | S8[2][12] = 15; 769 | S8[2][13] = 3; 770 | S8[2][14] = 5; 771 | S8[2][15] = 8; 772 | S8[3][0] = 2; 773 | S8[3][1] = 1; 774 | S8[3][2] = 14; 775 | S8[3][3] = 7; 776 | S8[3][4] = 4; 777 | S8[3][5] = 10; 778 | S8[3][6] = 8; 779 | S8[3][7] = 13; 780 | S8[3][8] = 15; 781 | S8[3][9] = 12; 782 | S8[3][10] = 9; 783 | S8[3][11] = 0; 784 | S8[3][12] = 3; 785 | S8[3][13] = 5; 786 | S8[3][14] = 6; 787 | S8[3][15] = 11; 788 | 789 | i[2:1] = {B[6], B[1]}; 790 | j[4:1] = B[5:2]; 791 | 792 | case(s_table_id) 793 | 5'b01: SBOX = S1[i][j]; 794 | 5'b10: SBOX = S2[i][j]; 795 | 5'b11: SBOX = S3[i][j]; 796 | 5'b100: SBOX = S4[i][j]; 797 | 5'b101: SBOX = S5[i][j]; 798 | 5'b110: SBOX = S6[i][j]; 799 | 5'b111: SBOX = S7[i][j]; 800 | 5'b1000: SBOX = S8[i][j]; 801 | endcase 802 | 803 | end 804 | endfunction 805 | 806 | function [32:1] f(input [32:1] R, input [48:1] K); 807 | reg [48:1] temp; 808 | reg [32:1] temp_after_s_box; 809 | reg [5:0] B[8:1]; 810 | begin 811 | temp = K ^ perm_E(R); 812 | B[1] = temp[48:43]; 813 | B[2] = temp[42:37]; 814 | B[3] = temp[36:31]; 815 | B[4] = temp[30:25]; 816 | B[5] = temp[24:19]; 817 | B[6] = temp[18:13]; 818 | B[7] = temp[12:7]; 819 | B[8] = temp[6:1]; 820 | 821 | temp_after_s_box = {SBOX(B[1], 5'd1), SBOX(B[2], 5'd2), SBOX(B[3], 5'd3), SBOX(B[4], 5'd4), 822 | SBOX(B[5], 5'd5), SBOX(B[6], 5'd6), SBOX(B[7], 5'd7), SBOX(B[8], 5'd8)}; 823 | 824 | f = perm_P(temp_after_s_box); 825 | end 826 | endfunction 827 | 828 | reg [64:1] new_msg; 829 | reg [32:1] L[16:0], R[16:0]; 830 | wire [48:1] key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16; 831 | reg [48:1] K[16:1]; 832 | integer i; 833 | ProcessKey pk(key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16, key); 834 | 835 | always @(message) 836 | begin 837 | new_msg = perm_IP(message); 838 | {L[0], R[0]} = new_msg; 839 | 840 | K[1] = key1; K[2] = key2; K[3] = key3; K[4] = key4; K[5] = key5; K[6] = key6; K[7] = key7; K[8] = key8; K[9] = key9; K[10] = key10; K[11] = key11; K[12] = key12; K[13] = key13; K[14] = key14; K[15] = key15; K[16] = key16; 841 | 842 | for(i=1; i<=16; i=i+1) 843 | begin 844 | L[i]=R[i-1]; 845 | R[i]=L[i-1] ^ f(R[i-1], K[i]); 846 | end 847 | ciphertext[64:1] = perm_IP_inverse({R[16], L[16]}); 848 | 849 | end 850 | endmodule -------------------------------------------------------------------------------- /ProcessKey.v: -------------------------------------------------------------------------------- 1 | 2 | module ProcessKey(output reg [48:1] key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16, input [64:1] key); 3 | 4 | function [56:1] PC1_perm(input [64:1] key); 5 | integer PC1[56:1]; 6 | integer i; 7 | reg [56:1] temp_perm; 8 | begin 9 | PC1[1] = 57; 10 | PC1[2] = 49; 11 | PC1[3] = 41; 12 | PC1[4] = 33; 13 | PC1[5] = 25; 14 | PC1[6] = 17; 15 | PC1[7] = 9; 16 | PC1[8] = 1; 17 | PC1[9] = 58; 18 | PC1[10] = 50; 19 | PC1[11] = 42; 20 | PC1[12] = 34; 21 | PC1[13] = 26; 22 | PC1[14] = 18; 23 | PC1[15] = 10; 24 | PC1[16] = 2; 25 | PC1[17] = 59; 26 | PC1[18] = 51; 27 | PC1[19] = 43; 28 | PC1[20] = 35; 29 | PC1[21] = 27; 30 | PC1[22] = 19; 31 | PC1[23] = 11; 32 | PC1[24] = 3; 33 | PC1[25] = 60; 34 | PC1[26] = 52; 35 | PC1[27] = 44; 36 | PC1[28] = 36; 37 | PC1[29] = 63; 38 | PC1[30] = 55; 39 | PC1[31] = 47; 40 | PC1[32] = 39; 41 | PC1[33] = 31; 42 | PC1[34] = 23; 43 | PC1[35] = 15; 44 | PC1[36] = 7; 45 | PC1[37] = 62; 46 | PC1[38] = 54; 47 | PC1[39] = 46; 48 | PC1[40] = 38; 49 | PC1[41] = 30; 50 | PC1[42] = 22; 51 | PC1[43] = 14; 52 | PC1[44] = 6; 53 | PC1[45] = 61; 54 | PC1[46] = 53; 55 | PC1[47] = 45; 56 | PC1[48] = 37; 57 | PC1[49] = 29; 58 | PC1[50] = 21; 59 | PC1[51] = 13; 60 | PC1[52] = 5; 61 | PC1[53] = 28; 62 | PC1[54] = 20; 63 | PC1[55] = 12; 64 | PC1[56] = 4; 65 | 66 | for(i=1; i<=56; i=i+1) 67 | temp_perm[56-i+1] = key[64-PC1[i]+1]; 68 | 69 | PC1_perm = temp_perm; 70 | end 71 | endfunction 72 | 73 | function [48:1] PC2_perm(input [56:1] key_s); 74 | integer PC2[48:1]; 75 | integer i; 76 | reg [48:1] temp_perm; 77 | begin 78 | PC2[1] = 14; 79 | PC2[2] = 17; 80 | PC2[3] = 11; 81 | PC2[4] = 24; 82 | PC2[5] = 1; 83 | PC2[6] = 5; 84 | PC2[7] = 3; 85 | PC2[8] = 28; 86 | PC2[9] = 15; 87 | PC2[10] = 6; 88 | PC2[11] = 21; 89 | PC2[12] = 10; 90 | PC2[13] = 23; 91 | PC2[14] = 19; 92 | PC2[15] = 12; 93 | PC2[16] = 4; 94 | PC2[17] = 26; 95 | PC2[18] = 8; 96 | PC2[19] = 16; 97 | PC2[20] = 7; 98 | PC2[21] = 27; 99 | PC2[22] = 20; 100 | PC2[23] = 13; 101 | PC2[24] = 2; 102 | PC2[25] = 41; 103 | PC2[26] = 52; 104 | PC2[27] = 31; 105 | PC2[28] = 37; 106 | PC2[29] = 47; 107 | PC2[30] = 55; 108 | PC2[31] = 30; 109 | PC2[32] = 40; 110 | PC2[33] = 51; 111 | PC2[34] = 45; 112 | PC2[35] = 33; 113 | PC2[36] = 48; 114 | PC2[37] = 44; 115 | PC2[38] = 49; 116 | PC2[39] = 39; 117 | PC2[40] = 56; 118 | PC2[41] = 34; 119 | PC2[42] = 53; 120 | PC2[43] = 46; 121 | PC2[44] = 42; 122 | PC2[45] = 50; 123 | PC2[46] = 36; 124 | PC2[47] = 29; 125 | PC2[48] = 32; 126 | 127 | for(i=1; i<=48; i=i+1) 128 | temp_perm[48-i+1] = key_s[56-PC2[i]+1]; 129 | 130 | PC2_perm = temp_perm; 131 | end 132 | endfunction 133 | 134 | function [56:1] C_i_D_i(input integer i, input [28:1] C_last, D_last); 135 | integer shift_left[1:16]; 136 | begin 137 | shift_left[1] = 1; 138 | shift_left[2] = 1; 139 | shift_left[3] = 2; 140 | shift_left[4] = 2; 141 | shift_left[5] = 2; 142 | shift_left[6] = 2; 143 | shift_left[7] = 2; 144 | shift_left[8] = 2; 145 | shift_left[9] = 1; 146 | shift_left[10] = 2; 147 | shift_left[11] = 2; 148 | shift_left[12] = 2; 149 | shift_left[13] = 2; 150 | shift_left[14] = 2; 151 | shift_left[15] = 2; 152 | shift_left[16] = 1; 153 | 154 | if(shift_left[i] == 'd1) 155 | C_i_D_i = {C_last[27:1], C_last[28], D_last[27:1], D_last[28]}; 156 | else if(shift_left[i] == 'd2) 157 | C_i_D_i = {C_last[26:1], C_last[28:27], D_last[26:1], D_last[28:27]}; 158 | 159 | end 160 | endfunction 161 | 162 | reg [56:1] temp_pc1; 163 | reg [28:1] C[16:0], D[16:0]; 164 | reg [48:1] K[1:16]; 165 | integer i; 166 | 167 | always @(key) 168 | begin 169 | temp_pc1 = PC1_perm(key); 170 | C[0] = temp_pc1[56:29]; 171 | D[0] = temp_pc1[28:1]; 172 | for(i=1; i<=16; i=i+1) 173 | begin 174 | {C[i], D[i]} = C_i_D_i(i, C[i-1], D[i-1]); 175 | K[i] = PC2_perm({C[i], D[i]}); 176 | end 177 | 178 | key1 = K[1]; 179 | key2 = K[2]; 180 | key3 = K[3]; 181 | key4 = K[4]; 182 | key5 = K[5]; 183 | key6 = K[6]; 184 | key7 = K[7]; 185 | key8 = K[8]; 186 | key9 = K[9]; 187 | key10 = K[10]; 188 | key11 = K[11]; 189 | key12 = K[12]; 190 | key13 = K[13]; 191 | key14 = K[14]; 192 | key15 = K[15]; 193 | key16 = K[16]; 194 | end 195 | endmodule -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # verilog-DES 2 | 3 | TpLevel module is inside ProcessKey.v 4 | TestBench is Test.v 5 | 6 | You may simulate and run test module in order to 7 | see the functionality of ProcessKey module. 8 | 9 | -------------------------------------------------------------------------------- /Test.v: -------------------------------------------------------------------------------- 1 | 2 | module test; 3 | 4 | // wire [48:1] key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16; 5 | reg [64:1] key; 6 | 7 | reg [64:1] message; 8 | wire [64:1] ciphertext; 9 | // ProcessKey pk(key1, key2, key3, key4, key5, key6, key7, key8, key9, key10, key11, key12, key13, key14, key15, key16, key); 10 | Encrypt e(ciphertext, message, key); 11 | 12 | initial 13 | begin 14 | key = 64'b00010011_00110100_01010111_01111001_10011011_10111100_11011111_11110001; 15 | message = 64'b0000_0001_0010_0011_0100_0101_0110_0111_1000_1001_1010_1011_1100_1101_1110_1111; 16 | end 17 | 18 | initial $monitor("ciphertext=%b", ciphertext); 19 | 20 | endmodule --------------------------------------------------------------------------------