外贸公司网站模板wordpress域名访问
- 作者: 五速梦信息网
- 时间: 2026年04月20日 08:20
当前位置: 首页 > news >正文
外贸公司网站模板,wordpress域名访问,个人app开发平台免费,wordpress主题图片消失chacha20算法请参看 RFC:7539。下面是我的理解#xff0c;欢迎指正。 chacha20算法的基本思想#xff1a;加密时#xff0c;将明文数据与用户之间约定的某些数据进行异或操作#xff0c;得到密文数据#xff1b;由异或操作的特点可知#xff0c;在解密时#xff0c;只需…chacha20算法请参看 RFC:7539。下面是我的理解欢迎指正。 chacha20算法的基本思想加密时将明文数据与用户之间约定的某些数据进行异或操作得到密文数据由异或操作的特点可知在解密时只需要将密文数据与用户之间约定的那些数据再次进行异或操作就得到了明文数据。 用相同值异或两次就能恢复出原来的值所以加密和解密都严格采用同一个程序。 从原理上来说chacha20的加解密过程还是非常简单的。这里面的难点在于理解 chacha20中那些用来与明文数据进行异或的数据是如何生成的这就是 chacha20算法的核心所在。 大体的流程是这样的首先用户之间会约定一些初始的元数据简单起见称之为 KEYS_INIT则 KEYS_INIT需要经过某种运算得到另外一个 KEYS_1然后用 KEYS_1与明文数据的第 1个分组进行异或以得到密文数据的第 1个分组接下来KEYS_INIT再经过某种运算得到另外一个 KEYS_2然后用 KEYS_2与明文数据的第 2个分组进行异或以得到密文数据的第 2个分组以此类推直到处理完所有的明文分组。从这里可以看到与每个明文分组进行异或的数据KEY_n是不相同的且与分组所对应的顺序有关。 下面讲解一下如何由 KEY_INIT得到 KEY_1, KEY_2, …, KEY_n。 首先需要明确的是在 chacha20算法中KEY_INIT和 KEY_n的长度是相同的都是 64个字节。因此明文分组的长度也是 64字节即 16个 4字节整数。 其中KEY_INIT由 4部分组成 KEY_INIT[0]~ KEY_INIT[15]是 16字节的常量constant; KEY_INIT[16]~ KEY_INIT[47]是 32字节的 key; KEY_INIT[48]~ KEY_INIT[51]是 4字节的 block counter; KEY_INIT[52]~ KEY_INIT[63]是 12字节的 nonce。 按顺序将上述 16个 4字节整数排列成 4x4的矩阵记为矩阵 M它的内容示意如下 cccccccc cccccccc cccccccc cccccccc kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkk kkkkkkkk kkkkkkkk kkkkkkkk kkkkkkk bbbbbbbb nnnnnnnn nnnnnnnn nnnnnnnn其中 c表示 constant的 4个 bit; k表示 key的 4个 bit; b表示 block counter的 4个 bit; n表示 nonce的 4个 bit 上面之所以把 64字节的 KEY_INIT排列成矩阵的形式是因为后续的计算都是在这个矩阵上展开的写成矩阵形式后能很清楚看到每次参与计算的元素的相对位置。 基于上述的 4x4矩阵chacha20里面的运算包含两种形式列运算和对角线运算。先暂时不说列运算和对角线运算的具体含义先讲讲计算中涉及的 轮的概念简单讲轮是若干个运算步骤的组合chacha20中的 20就是指进行 20轮运算。在 chacha20中 1个轮还可以进一步划分为 4个 四分之一轮也就是说chacha20包含 80个 四分之一轮组成的运算。 终于讲到四分之一轮的概念了先给出四分之一轮的定义如下所示 a b; d ^ a; d 16; c d; b ^ c; b 12; a b; d ^ a; d 8; c d; b ^ c; b 7;从上述定义可以看到四分之一轮的定义很简单只有 4个变量参与运算共计 12个基本操作涉及 3种普通运算加法、异或、循环移位。值得注意的是这 4个变量都是 4字节整数加法运算是模 2^32的。 现在可以猜到在每个四分之一轮中a, b, c, d这 4个 4字节整数均来自于矩阵 M现在来讲讲列运算和对角线运算的含义。先用 4字节整数出现的顺序来重新表示矩阵 M记为矩阵 T 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15有了上述索引表示则所谓的列运算就是在四分之一轮中a, b, c, d这 4个 4字节整数在矩阵 M中的索引为矩阵 T的某个列向量。 具体来说就是 对于第 1个四分之一轮而言a, b, c, d在矩阵 M中的索引为 0, 4, 8, 12 对于第 2个四分之一轮而言a, b, c, d在矩阵 M中的索引为 1, 5, 9, 13 对于第 3个四分之一轮而言a, b, c, d在矩阵 M中的索引为 2, 6, 10, 14, 对于第 4个四分之一轮而言a, b, c, d在矩阵 M中的索引为 3, 7, 11, 15。 同理所谓的对角线运算就是在四分之一轮中a, b, c, d这 4个 4字节整数在矩阵 M中的索引为矩阵 T的对角线元素。 具体来说就是 对于第 1个四分之一轮而言a, b, c, d在矩阵 M中的索引为 0, 5, 10, 15 对于第 2个四分之一轮而言a, b, c, d在矩阵 M中的索引为 1, 6, 11, 12 对于第 3个四分之一轮而言a, b, c, d在矩阵 M中的索引为 2, 7, 8, 13, 对于第 4个四分之一轮而言a, b, c, d在矩阵 M中的索引为 3, 4, 9, 14。 有了上述背景知识现在就可以对 chacha20中的 20轮运算有一个整体的认识在 chacha20中先执行 4个 四分之一轮的列运算再执行 4个四分之一轮的对角线运算然后将这两轮运算重复10遍这样一共就是 20轮运算在执行完 20轮运算后得到一个新的矩阵记为矩阵 S然后还需要将原矩阵 M与刚刚得到的矩阵 S对应位置元素相加以便得到最终的矩阵记为矩阵 W最后以小端序将矩阵 W的 16个 4字节整数整理为一个 64字节的数据块也即上述中的 KEY_n并与 64字节的明文分组相异或得到对应的密文分组。 综上所述在 chacha20中明文数据会被划分为若干个 64字节的分组然后通过 chacha20算法计算出对应的 KEY_n也即是上述中的矩阵 W并让明文分组与 KEY_n相异或得到对应的密文分组。其中最重要的一点是在每处理完一个分组后矩阵 M中的 block counter部分需要自增 1其他三个部分 constant, keynonce保持不变这样就确保了对于不同的明文分组对应的 KEY_n是不同的。若最后一个明文分组不足 64字节则只异或 KEY_n中对应的字节。因此即使明文分组不足 64字节也不影响计算但对应的 KEY_n的所有字节矩阵 W的所有元素需要被全部计算出来。 忘了说了KEY_INIT中的前 16字节 constant是个字符串它的内容是expand 32-byte k数一下应该是 16字节。 下面给出 chacha20算法的 C语言实现摘自 OpenSSL项目的 crypto/chacha/chacha_enc.c文件可以在 github或 gitee上再看看这段代码 https://github.com/openssl/openssl/blob/master/crypto/chacha/chacha_enc.c https://gitee.com/mirrors/openssl/blob/master/crypto/chacha/chacha_enc.c typedef unsigned int u32; typedef unsigned char u8; typedef union {u32 u[16];u8 c[64]; } chacha_buf;# define ROTATE(v, n) (((v) (n)) | ((v) (32 - (n))))# define U32TO8_LITTLE(p, v) do { (p)0(v 0); (p)1(v 8); (p)2(v 16); (p)3(v 24); } while(0)/* QUARTERROUND updates a, b, c, d with a ChaCha quarter round. */
define QUARTERROUND(a,b,c,d) ( \x[a] x[b], x[d] ROTATE((x[d] ^ x[a]),16), \x[c] x[d], x[b] ROTATE((x[b] ^ x[c]),12), \x[a] x[b], x[d] ROTATE((x[d] ^ x[a]), 8), \x[c] x[d], x[b] ROTATE((x[b] ^ x[c]), 7) )/* chacha_core performs 20 rounds of ChaCha on the input words in* |input| and writes the 64 output bytes to |output|. */
static void chacha20_core(chacha_buf *output, const u32 input[16]) {u32 x[16];int i;DECLARE_IS_ENDIAN;memcpy(x, input, sizeof(x));for (i 20; i 0; i - 2) {QUARTERROUND(0, 4, 8, 12);QUARTERROUND(1, 5, 9, 13);QUARTERROUND(2, 6, 10, 14);QUARTERROUND(3, 7, 11, 15);QUARTERROUND(0, 5, 10, 15);QUARTERROUND(1, 6, 11, 12);QUARTERROUND(2, 7, 8, 13);QUARTERROUND(3, 4, 9, 14);}if (IS_LITTLE_ENDIAN) {for (i 0; i 16; i)output-u[i] x[i] input[i];} else {for (i 0; i 16; i)U32TO8_LITTLE(output-c 4 * i, (x[i] input[i]));} }void ChaCha20_ctr32(unsigned char *out, const unsigned char inp,size_t len, const unsigned int key[8],const unsigned int counter[4]) {u32 input[16];chacha_buf buf;size_t todo, i;/ sigma constant expand 32-byte k in little-endian encoding /input0 | ((u32)ossl_toascii(x) 8)| ((u32)ossl_toascii(p) 16)| ((u32)ossl_toascii(a) 24);input1 | ((u32)ossl_toascii(d) 8)| ((u32)ossl_toascii( ) 16)| ((u32)ossl_toascii(3) 24);input2 | ((u32)ossl_toascii(-) 8)| ((u32)ossl_toascii(b) 16)| ((u32)ossl_toascii(y) 24);input3 | ((u32)ossl_toascii(e) 8)| ((u32)ossl_toascii( ) 16)| ((u32)ossl_toascii(k) 24);input[4] key[0];input[5] key[1];input[6] key[2];input[7] key[3];input[8] key[4];input[9] key[5];input[10] key[6];input[11] key[7];input[12] counter[0];input[13] counter[1];input[14] counter[2];input[15] counter[3];while (len 0) {todo sizeof(buf);if (len todo)todo len;chacha20_core(buf, input);for (i 0; i todo; i)out[i] inp[i] ^ buf.c[i];out todo;inp todo;len - todo;/** Advance 32-bit counter. Note that as subroutine is so to say nonce-agnostic, this limited counter width doesnt* prevent caller from implementing wider counter. It would* simply take two calls split on counter overflow…*/input[12];} }参考资料 chacha20算法的RFC: https://www.rfc-editor.org/rfc/rfc7539
- 上一篇: 外贸公司网站开发步骤衡阳市建设局网站
- 下一篇: 外贸公司网站素材上海网站制作哪家奿
相关文章
-
外贸公司网站开发步骤衡阳市建设局网站
外贸公司网站开发步骤衡阳市建设局网站
- 技术栈
- 2026年04月20日
-
外贸公司网站开发wordpress素材下载源码
外贸公司网站开发wordpress素材下载源码
- 技术栈
- 2026年04月20日
-
外贸公司网站建设哪家好山东网站备案拍照
外贸公司网站建设哪家好山东网站备案拍照
- 技术栈
- 2026年04月20日
-
外贸公司网站素材上海网站制作哪家奿
外贸公司网站素材上海网站制作哪家奿
- 技术栈
- 2026年04月20日
-
外贸公司网站怎么做营销式网站建设公司
外贸公司网站怎么做营销式网站建设公司
- 技术栈
- 2026年04月20日
-
外贸家具网站首页设计wordpress主题模板怎么用
外贸家具网站首页设计wordpress主题模板怎么用
- 技术栈
- 2026年04月20日
