1. 云栖社区>
  2. PHP教程>
  3. 正文

【密码学】PHP实现AES核心步骤

作者:用户 来源:互联网 时间:2017-11-30 09:43:55

php密码学实现aes步骤核心

【密码学】PHP实现AES核心步骤 - 摘要: 本文讲的是【密码学】PHP实现AES核心步骤, 1. 介绍 之前用C语言写了AES核心步骤,关于AES的大致内容如下链接 【密码学】C语言实现AES核心步骤 最近密码程序设计我只选到了用PHP完成AES的核心步骤,所以就用PHP写,和C语言核心思想一样,只是这次的要求是输入字符串,不能

1. 介绍

之前用C语言写了AES核心步骤,关于AES的大致内容如下链接

【密码学】C语言实现AES核心步骤

最近密码程序设计我只选到了用PHP完成AES的核心步骤,所以就用PHP写,和C语言核心思想一样,只是这次的要求是输入字符串,不能直接输入16进制数了,有一些细微上的变换

2. 要求

实现AES算法加密核心步骤详细过程。
功能要求:
1. 展现出AES算法核心变换:包括输入字符串转换为ASCII(十六进制),然后转换为4*4状态矩阵,展现出字节替代、列混合、行移位、有限域字节乘的各种变换函数完成。

  1. 字节替代的展示功能,输入一行16字节(十六进制),转换为4*4矩阵,然后完成字节替代,输出显示出替代后结果(十六进制)。

  2. 行移位展示功能:输入一行16字节(十六进制),转换为4*4矩阵,然后完成行移位,输出显示出行移位结果(十六进制)。

  3. AES的多项式构造的有限域两元素相乘展示功能:输入有限域2元素(即2字节(十六进制)),输出有限域下2元素相乘的结果(十六进制)

  4. 列混合功能展示:输出一行16字节(十六进制),转换为4*4矩阵,然后完成列混合功能,输出显示列混合后结果(十六进制)。
  5. 轮密钥加展示:输出两行16字节(十六进制),转换为4*4矩阵,然后完成轮密钥加功能,输出轮密钥加结果(十六进制)。

输出要求:
1. 密钥加、字节替代、行移位、列混合等写成函数;
2. 可以参照fips-197标准中的数据,给出验证结果。

3. 实现结果

【密码学】PHP实现AES核心步骤-

【密码学】PHP实现AES核心步骤-

验证结果,用符合fips-192(AES)标准的算法去验证,和该代码核心思想一样,只是一开始直接写好数据,和我们输入数据想比较

【密码学】PHP实现AES核心步骤-

【密码学】PHP实现AES核心步骤-

【密码学】PHP实现AES核心步骤-

【密码学】PHP实现AES核心步骤-

4. 实现代码

由于我是加了一些css的,所以我在这里放出没有css的代码,本人菜狗子,有写的不好或者错误的地方,还请大佬们指正,感谢。代码如下:

<!DOCTYPE html><html lang="en"><head>    <meta charset="UTF-8">    <title>AES核心算法步骤</title></head><body><?phpdefine("N", 4);$Sbox = array(    //         0     1     2     3     4     5     6     7     8     9     A     B     C     D     E     F    /*0*/array(0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5, 0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76),    /*1*/array(0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0, 0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0),    /*2*/array(0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc, 0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15),    /*3*/array(0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a, 0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75),    /*4*/array(0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0, 0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84),    /*5*/array(0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b, 0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf),    /*6*/array(0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85, 0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8),    /*7*/array(0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5, 0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2),    /*8*/array(0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17, 0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73),    /*9*/array(0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88, 0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb),    /*A*/array(0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c, 0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79),    /*B*/array(0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9, 0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08),    /*B*/array(0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6, 0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a),    /*D*/array(0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e, 0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e),    /*E*/array(0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94, 0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf),    /*F*/array(0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68, 0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16));$RoundKey = array(    array(0xa0, 0x88, 0x23, 0x2a),    array(0xfa, 0x54, 0xa3, 0x6c),    array(0xfe, 0x2c, 0x39, 0x76),    array(0x17, 0xb1, 0x39, 0x05));function SubBytes(&$State) {   //字节替代    global $Sbox;    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            $low = $State[$i][$j] & 0x0F;   //取低4位            $high = ($State[$i][$j] >> 4) & 0x0F;   //取高4位            $State[$i][$j] = $Sbox[(16 * $high + $low) / 16][(16 * $high + $low) % 16];        }    }    echo "字节替代后:<br>";    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            printf("%02x ", $State[$i][$j]);        }        echo "<br>";    }    echo "<br>";}function ShiftRows(&$State) {    //行移位    $shiftnum = 0;    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < $shiftnum; $j++) {            $tmp = $State[$i][0];            for ($k = 0; $k < N-1; $k++) {                $State[$i][$k] = $State[$i][$k+1];            }            $State[$i][$k] = $tmp;        }        $shiftnum++;    }    echo "行移位后:<br>";    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            printf("%02x ", $State[$i][$j]);        }        echo "<br>";    }    echo "<br>";}function gfmultby01(&$b) {    return $b;}function gfmultby02(&$b) {    if ($b < 0x80) {        return $b << 1;    } else {        return ($b << 1) & 0xff ^ 0x1b;    }}function gfmultby03(&$b) {    return gfmultby02($b) ^ $b;}function choose(&$a, &$b) {    if ($a == 0x01) {        return gfmultby01($b);    }    if ($a == 0x02) {        return gfmultby02($b);    }    if ($a == 0x03) {        return gfmultby03($b);    }    return $b;}function MixColumns(&$State) {   //列混合    $mix = array(        array(0x02, 0x03, 0x01, 0x01),        array(0x01, 0x02, 0x03, 0x01),        array(0x01, 0x01, 0x02, 0x03),        array(0x03, 0x01, 0x01, 0x02)    );    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            for ($k = 0; $k < N; $k++) {                $tmp[$k] = choose($mix[$i][$k], $State[$k][$j]);            }            $end[$i][$j] = $tmp[0] ^ $tmp[1] ^ $tmp[2] ^ $tmp[3];        }    }    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            $State[$i][$j] = $end[$i][$j];        }    }    echo "列混合后:<br>";    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            printf("%02x ", $State[$i][$j]);        }        echo "<br>";    }    echo "<br>";}function AddRoundKey(&$State, &$RoundKey) {    //轮密钥加    for ($i = 0; $i < N; $i++) {        for ($j = 0; $j < N; $j++) {            $State[$j][$i] = $State[$j][$i] ^ $RoundKey[$j][$i];        }    }        echo "轮密钥加后:<br>";        for ($i = 0; $i < N; $i++) {            for ($j = 0; $j < N; $j++) {                printf("%02x ", $State[$i][$j]);            }            echo "<br>";        }}?>    <!--<div style="width:520px;height:34px;margin:40px auto 0 auto;">-->    <form action="#" method="post">        请输入连续的16位字符串:        <br>        <input type="text" placeholder="字符串内容" style="height:25px; width: 300px" name="str"/>        <input type="submit" style="width: 75px" value="提交" />    </form>    <br>    <?php    error_reporting(0);    function main() {        global $RoundKey;        if (!isset($_POST['str'])) return;        if ($_POST['str'] == NULL) {            echo "输入为空,请重新输入!";            return;        }        if (strlen($_POST['str']) != 16) {            echo "输入内容有误,请重新输入!";            return;        }        $string = $_POST['str'];        echo "输入字符串为:" . $string . " " . "<br>";        for ($i = 0; $i < strlen($string); $i++) {            $tmp_1[$i] = ord(substr($string, $i, 1));        }        for ($i = 0; $i < N; $i++) {            for ($j = 0; $j < N; $j++) {                $State[$i][$j] = $tmp_1[$i * 4 + $j];            }        }        for ($i = 0; $i < N; $i++) {            for ($j = 0; $j < $i + 1; $j++) {                $tmp_2 = $State[$i][$j];                $State[$i][$j] = $State[$j][$i];                $State[$j][$i] = $tmp_2;            }        }        echo "<br>";        echo "原始数据为:<br>";        for ($i = 0; $i < N; $i++) {            for ($j = 0; $j < N; $j++) {                printf("%02x ", $State[$i][$j]);            }            echo "<br>";        }        echo "<br>";        SubBytes($State);        ShiftRows($State);        MixColumns($State);        AddRoundKey($State, $RoundKey);    }    main();    ?></div></body></html>

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索php , 密码学 , 实现 , aes , 步骤 核心 ,以便于您获取更多的相关知识。