摘要: 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 阅读全文
posted @ 2013-11-05 09:19 7hat 阅读(16500) 评论(6) 推荐(1) 编辑
摘要: 求最大公约数,一般采用gcd算法。http://zh.wikipedia.org/wiki/%E6%AC%A7%E5%87%A0%E9%87%8C%E5%BE%97%E7%AE%97%E6%B3%95gcd算法简单高效,是对数级别的算法。下面给出它的递归形式和迭代形式。def gcd(a, b): if b == 0: return a return gcd(b, a%b)def gcd1(a, b): while b != 0: r = a % b a = b b = r return aprint gcd(13... 阅读全文
posted @ 2013-11-04 14:50 7hat 阅读(4597) 评论(0) 推荐(0) 编辑
摘要: 测试一个数是否为素数。当这个数很小时,我们当然可以用试除法(用2到sqrt(N)看能否整除N)来做素性测试。当这个数很大时,例如1024bit即1~2^1024,这个方法就显得效率太低。考虑一个数有k位,每增加一位,N增大一倍,试除法此时是指数级别的算法。对于大整数的素性测试,一般用Miller-Rabin算法。它是一个基于概率的算法,是费马小定理(若n是一个素数,a^(n-1) mod n == 1;反之,n有可能是一个素数)的一个改进。理论基础:若n是一个素数,a>= 1 # b, b^2, b^4, b^8, ... , b^(2^n) b = (b*b) %... 阅读全文
posted @ 2013-11-01 08:55 7hat 阅读(2283) 评论(4) 推荐(0) 编辑
摘要: 与快速幂类似.http://www.cnblogs.com/7hat/p/3387267.html只是在每次运算的时候要作mod m运算,利用的是模运算规则 (a * b) mod m = ((a mod m) * (b mod m)) mod m.因为python直接支持大整数运算,所以这次用python来做,检验结果的对错。从另外一个角度上看,用快速幂取模的方法比直接求幂再取模的方法要快,因为将乘数限制在一定的范围。"""e = e0*(2^0) + e1*(2^1) + e2*(2^2) + ... + en * (2^n)b^e = b^(e0*(2^0) 阅读全文
posted @ 2013-10-31 08:10 7hat 阅读(3807) 评论(0) 推荐(0) 编辑
摘要: 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 阅读全文
posted @ 2013-10-30 07:13 7hat 阅读(920) 评论(0) 推荐(0) 编辑
摘要: 之前写过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... 阅读全文
posted @ 2013-10-29 21:00 7hat 阅读(511) 评论(0) 推荐(0) 编辑
摘要: 分治的经典算法。import java.util.Random;import java.util.Arrays;public class BinarySearch{ public static int binarySearch(int[] A, int x){ return binarySearchDo(A, x, 0, A.length-1); } private static int binarySearchDo(int[] A, int x, int low, int high){ if(low > high) retu... 阅读全文
posted @ 2013-10-29 08:50 7hat 阅读(188) 评论(0) 推荐(0) 编辑
摘要: 同时找出一个序列中的最小值最大值,一般方法需要2*(n-1)的比较次数。运用分治,可以降低比较次数。基本思路:把序列分为两部分,找出前半部分的最小值与最大值,再找出后半部分的最小值与最大值,然后比较得出整个序列的最小值与最大值。一直划分到序列只有两个元素时,则直接比较两个元素并返回结果。比较次数分析:f(1) = 1; f(2) = 1; 当n为奇数时,f(n) = f([n/2]) + f(n-[n/2]) + 2; 当n为偶数时,f(n) = 2*f(n/2) + 2.可以证明比较次数最多不超过3*[n/2]。import java.util.Random;import java.util 阅读全文
posted @ 2013-10-28 19:17 7hat 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 给定一个n,返回1, 2, 3, ... , n 的全排列。这里给出两种方法。它们的时间复杂度都是O(n!),因为n的全排列有n!种。1.基于以下观察:第k个位置可以是1, 2, 3, ... , or n。如,第一个位置可以是1, 2, 3, ... , or n,在确定这个位置的数后,那么第二个位置的数就可以是除已确定的数之外的数,如此类推,知道确定到第n-1个位置上的数(此时第n个位置的数显然也确定了)。例如,n=3, 全排列(和代码输出的可能略有差异,但思路是这样):1, 2, 31, 3, 22, 1, 32, 3, 13, 1, 23, 2, 12.基于以下观察:k 可以放在第1, 阅读全文
posted @ 2013-10-27 15:38 7hat 阅读(248) 评论(0) 推荐(0) 编辑
摘要: 求x^m 一般方法是 xm = x * xm-1,这样需要做m次乘法,未免过慢。加速方法有两种。1.基于当m为偶数时, xm = (x2)^(m/2) ;当m为奇数时, xm = x * xm-1。显然当m为偶数时m会减半,当m为奇数时,下次就是偶数。m可以很快收敛到0.(^表示幂)2.将m看成二进制串mkmk-1...m1m0,那么xm = xm0*2^0 + m1*2^1 + ... + mk*2^k = xm0*2^0 * xm1*2^1 * ... * xmk*2^k. mi为0或1,假设平均有一半mi为1,即k个,那么总共才只需要做(k+(k/2))次乘法。下面给出代码。第一个方法是 阅读全文
posted @ 2013-10-25 09:22 7hat 阅读(830) 评论(0) 推荐(0) 编辑