毕业设计要做IDEA密码算法的安全性分析,先写个算法实现代码,以备后用。 /* IDEA.h */ #ifndef IDEA_H #define IDEA_H /* define return status */ #define IDEA_SUCCESS 0 #define IDEA_ERROR 1 /* define data length */ #define IDEA_KEY_LEN 128 #define IDEA_BLOCK_SIZE 64 #define IDEA_SUB_BLOCK_SIZE 16 /* define global variable */ #define IDEA_ADD_MODULAR 65536 #define IDEA_MP_MODULAR 65537 /* define operation mode */ #define ECB 0 #define CBC 1 #define CFB 2 #define OFB 3 /* define data type */ //typedef bool bit_t, status_t; typedef unsigned char byte_t, uint8_t; typedef unsigned short word_t, uint16_t; typedef unsigned int dword_t, uint32_t, status_t; typedef unsigned long long uint64_t; /* declare fuction */ status_t idea_encrypt(uint64_t plaintext, uint16_t key[8], uint64_t *ciphertext); status_t idea_decrypt(uint64_t ciphertext, uint16_t key[8], uint64_t *plaintext); status_t idea_round(uint16_t X[4], uint16_t Z[6], uint16_t out[4]); status_t MA(uint16_t ma_in[2], uint16_t sub_key[2],uint16_t ma_out[2]); status_t subkey_generation(uint16_t key[8], uint16_t sub_key[52]); status_t subdkey_generation(uint16_t key[8], uint16_t sub_dkey[52]); status_t extended_eucild(uint16_t d, uint32_t k, uint32_t *result); #endif /* IDEA(International Data Encryption Algorithm), refer to http://www.quadibloc.com/crypto/co040302.htm * IDEA.c, an IDEA encryption and decryption program. * Author shenyang * Mar. 4th, 2011 * TODO: Fault analysis on IDEA, defence of fault analysis on IDEA. */ #ifndef IDEA_H #include "IDEA.h" #endif #include <string.h> #include <stdio.h> /* define operation */ static uint16_t add_mod(uint16_t a, uint16_t b); static uint16_t mp_mod(uint16_t a,uint16_t b); static uint16_t XOR(uint16_t a, uint16_t b); static status_t left_shift(uint16_t key[8], int num); static void swap(uint16_t *a, uint16_t *b); /* addition and mod 65536 */ static uint16_t add_mod(uint16_t a, uint16_t b) { uint32_t tmp = a+b; uint16_t ret = tmp % IDEA_ADD_MODULAR; return ret; } /* multiply and mod 65537 */ static uint16_t mp_mod(uint16_t a,uint16_t b) { /* Note: In IDEA, for purposes of multiplication, a 16 bit word containing all zeroes is considered to represent the number 65,536; * other numbers are represented in conventional unsigned notation, and multiplication is modulo the prime number 65,537 */ uint64_t tmp, tmp_a, tmp_b; //if both a and b are 2^16, the result will be 2^32 which will exceed a 32-bit int tmp_a = a==0 ? (1<<16) : a; tmp_b = b==0 ? (1<<16) : b