zoukankan      html  css  js  c++  java
  • GF(2^8)乘法

    最近在学AES,实现了一下伽罗瓦域(2^8)乘法。

    至于什么是伽罗瓦域解释起来比较复杂,我也不一定能解释清楚,自行google。这里只是给出一个简单直观的实现。

    #include<iostream>
    #include<fstream>
    using namespace std;
    unsigned char GFmul(unsigned char a, unsigned char b){
        //GF(2^8) 乘法
        unsigned char result = 0;
        //若b为奇数,则先累积a
        if((b&1) == 1)result = a;
        b >>= 1;
        for(int i = 1; i < 8; i ++){
            //从b1开始遍历,若遇到bi为1,则累积a。a每次乘2自增
            if(a > 127){
                a = (a << 1) ^ 0x1b;
            }
            else{
                a <<= 1;
            }
            if((b&1) == 1){
                result ^= a;
            }
            b >>= 1;
        }
        return result;
    }
    int main(){
        //测试用例,输出所有数的乘法结果,看是否均匀
        int count[256];
        for(int i = 0; i < 256; i ++)count[i] = 0;
        unsigned char x, y;
        x = 0;
        do{
            y = 0;
            do{
                count[GFmul(x, y)] ++;
                y ++;
            }while(y != 0);
            x ++;
        }while(x != 0);
        ofstream write("Test.txt");
        for(int i = 0; i < 256; i ++)write<<i<<"	"<<count[i]<<endl;
        write.close();
        return 0;
    }
    C++
  • 相关阅读:
    vim 的配置文件
    linux bash 的自动补全
    linux ping 命令
    linux 安装ifconfig
    dos exist 命令
    linux 用户的添加,组的添加,以及查看
    if else 的.bat 文件
    For 的.bat文件
    rmdir 的.bat文件
    dos set 命令
  • 原文地址:https://www.cnblogs.com/7hat/p/3383172.html
Copyright © 2011-2022 走看看