随笔分类 - 密码学
摘要:RSA算法是一种非对称加密算法,是现在广泛使用的公钥加密算法,主要应用是加密信息和数字签名。详情请看维基:http://zh.wikipedia.org/wiki/RSA%E5%8A%A0%E5%AF%86%E6%BC%94%E7%AE%97%E6%B3%95算法基本思路:1.公钥与私钥的生成:(1)随机挑选两个大质数 p 和 q,构造N = p*q;(2)计算欧拉函数φ(N) = (p-1) * (q-1);(3)随机挑选e,使得gcd(e, φ(N)) = 1,即 e 与φ(N) 互素;(4)计算d,使得 e*d ≡ 1 (mod φ(N)),即d 是e 的乘法逆元。此时,公钥为(e, N
阅读全文
摘要:Description:Decode the message.You intercept the following message, which you know has been encoded using the modulusm = 956331992007843552652604425031376690367 and exponent e = 12398737.Break the code and decipher the message.821566670681253393182493050080875560504,870741731290463997209497869585113
阅读全文
摘要:之前写过SBOX的构造,后来看到别人的优秀思路,借鉴过来重新改了一点。原文地址:http://www.cnblogs.com/7hat/p/3383546.html主要是将矩阵运算改为列运算之和,提高了效率。#include#include#include using namespace std;unsigned char exp[256], log[256], inv[256];unsigned char GFmul(unsigned char a, unsigned char b){ //GF(2^8) 乘法 unsigned char result = 0; if((b...
阅读全文
摘要:利用GF(2^8)乘法逆元,以及矩阵运算,可以构造出AES的SBOX。求乘法逆元的一般方法是利用扩展欧几里得定理,在这里我取了个巧。因为我已经有了GF的指数表(见上一篇文),利用指数表可以轻易地构造出乘法逆元表。具体方法如下:若 x = 3^m, y = 3^n, x 与 y 互为乘法逆元,则有x * y = 3^m * 3^n = 1 = 3^255(任意乘法逆元的255次方必定为1,有点类似费尔马小定理),则m+n=255#include#include#include using namespace std;unsigned char exp[256], log[256], inv[25
阅读全文
摘要:利用指数表和对数表,实现GF(2^8)的乘法优化。首先利用简单的基础的GF(2^8)乘法,构造指数表和对数表。在这里选取生成元3。指数表exp[i] = 3^i,对数表log[i] = log3(i)。要实现x 与 y 相乘,首先利用对数表找出3^m = x, 3^n = y,这时的乘法就是 x * y = 3^m * 3^n = 3^(m+n),然后利用指数表找到exp[m+n]对应的值。因此所有的乘法都变成了查表操作,提高了效率。但是对于数域较大时,保存对数表和指数表的空间要求较高。典型的牺牲空间换取时间。#include#includeusing namespace std;unsign
阅读全文
摘要:目的是找出所有GF(2^8)的生成元。方法很简单,从2开始遍历,将每个元素都与自身相乘255次,看是否能得到1~255。若能,则是生成元。#include#includeusing namespace std;unsigned char GFmul(unsigned char a, unsigned char b){ //GF(2^8) 乘法 unsigned char result = 0; if((b&1) == 1)result = a; b >>= 1; for(int i = 1; i 127){ a = (a >= 1; ...
阅读全文
摘要:最近在学AES,实现了一下伽罗瓦域(2^8)乘法。至于什么是伽罗瓦域解释起来比较复杂,我也不一定能解释清楚,自行google。这里只是给出一个简单直观的实现。#include#includeusing 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 127){ ...
阅读全文

浙公网安备 33010602011771号