前言
老师布置的作业,用c语言实现aes算法。在这里边,思路都懂,但是对于一些像取字的前四位,字符拼接,按位查找s表等等 用c语言实现,👴很迷惑。看了这篇博主写的文章,懂了很多。想到以后还会用到这类函数算法,于是就再次做一个总结。
1.AES加密算法用到的
1.获取整型数据的低8位的左4位(整形是两字节,16位)
static int getLeft4Bit(int num) {
int left = num & 0x000000f0;
return left >> 4;//不懂
}
2.获取整形数据的低8位的右4位
static int getRight4Bit(int num) {
return num & 0x0000000f;
}
3.从S盒中获取元素
static int getNumFromSBox(int index) {
int row = getLeft4Bit(index);
int col = getRight4Bit(index);
return S[row][col];
}
4.将字符转换成整形(强转)
static int char_to_int(char c) {
int result = (int) c;
return result & 0x000000ff;
}
5.将16个字符转成4x4的数组,
static void char_to_intarray(char *str, int pa[4][4]) {
int k = 0;
int i,j;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++) {
pa[j][i] = getIntFromChar(str[k]);
k++;
}
}
6.打印字符串的ASSCII,以16进制显示
static void printASSCI(char *str, int len) {
int i;
for(i = 0; i < len; i++)
printf("0x%x ", getIntFromChar(str[i]));
printf("\n");
}
7.把连续的4个字符合并成一个4字节的整型
static int getWordFromStr(char *str) {
int one, two, three, four;
one = getIntFromChar(str[0]);
one = one << 24;
two = getIntFromChar(str[1]);
two = two << 16;
three = getIntFromChar(str[2]);
three = three << 8;
four = getIntFromChar(str[3]);
return one | two | three | four;
}
8.把一个4字节的数的第一、二、三、四个字节取出,入进一个4个元素的整型数组里面。
static void splitIntToArray(int num, int array[4]) {
int one, two, three;
one = num >> 24;
array[0] = one & 0x000000ff;//one & 0x000000ff表示取one的低8位
two = num >> 16;
array[1] = two & 0x000000ff;
three = num >> 8;
array[2] = three & 0x000000ff;
array[3] = num & 0x000000ff;
}
9.将数组中的元素循环左移step位
static void leftLoop4int(int array[4], int step) {
int temp[4];
int i;
int index;
for(i = 0; i < 4; i++)
temp[i] = array[i];
index = step % 4 == 0 ? 0 : step % 4;
for(i = 0; i < 4; i++){
array[i] = temp[index];
index++;
index = index % 4;
}
}
10.把数组中的第一、二、三和四元素分别作为4字节整型的第一、二、三和四字节,合并成一个4字节整型
static int mergeArrayToInt(int array[4]) {
int one = array[0] << 24;
int two = array[1] << 16;
int three = array[2] << 8;
int four = array[3];
return one | two | three | four;
}
11.将4x4数组转成字符串
static void convertArrayToStr(int array[4][4], char *str) {
int i,j;
for(i = 0; i < 4; i++)
for(j = 0; j < 4; j++)
*str++ = (char)array[j][i];
}
11.将字符转化成4x4的数组
static void char_to_arry(char *str, int parry[4][4])//将字符串转成4x4的数组
{
int k=0;
for (int i = 0; i < 4; i++)
{
for (int j = 0; j < 4; j++)
{
parry[j][i] = char_to_int(str[k]);
k++;
}
}
}