700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > 基于Python实现的RSA加密和解密算法

基于Python实现的RSA加密和解密算法

时间:2024-01-19 06:34:14

相关推荐

基于Python实现的RSA加密和解密算法

目录

第 一部分 RSA 加密和解密算法 1

算法原理 1

1.1 RSA 原理概述 1

用中国剩余定理CRT对RSA运算进行加 2代码实现 2

2.1 RSA 代码实现 2

2.2 CRT-RSA 代码实现 4算法效果对比 5

第 二部分 图像数字水印技术 5数字水印算法思路 5计算图像通道的 DCT 变换,得到 DCT 矩阵 6遍历每一个分块: 7最后将各通道聚合在一起,得到嵌入水印的彩色图片,并输出。 8

1.3 数字水印检测与验证 8代码实现 8代码测试 15

3.1 数字水印生成测试 15

3.2 数字水印嵌入测试与方法比较 16

3.3 数字水印检测、验证与攻击测试 17

附录-2 digwtmk.py 输出结果 20

第 二部分 图像数字水印技术

在图像数字水印技术的两类经典水印嵌入算法中,选择 DCT变换域上的扩频水印嵌入算法进行实现。

1.数字水印算法思路

1.1 数字水印生成

水印生成技术我们采用扩频水印生成。本文转载自http://www.biyezuopin.vip/onews.asp?id=16717我们所设计的算法如下: 输入:数字水印 ID(例如一串数字),目标长度

输出:扩频水印信号 和 伪随机噪声序列

算法步骤:

1.首先,将数字水印 ID 转化为二进制 01 串 ,我们设置扩频的目标长度为

2.接下来使用基于片率的扩频技术,将水印串 延长到 长度,具体的扩频方法采用按位扩展,得到串 如下所示:

3.得到扩频水印串 后,为了避免水印信息泄露,我们随机生成一个阔带伪随机信号 , 的长度同样为 ,将 与 进行异或,得到最终的扩频水印信号 。

在数字水印验证时,我们只需要将提取出的水印信号再与阔带伪随机信号 进行异或,就可以获得原始的扩展序列 ,最后与 进行比较即可。

1.2数字水印嵌入

数字水印嵌入我们设计了基于全局水印嵌入和基于分块水印嵌入两种方法,它们都在 DCT 变换域上进行水印嵌入,并且使用加性嵌入。我们的水印算法能够用在彩色图像上而不仅仅只是灰度图像。

全局水印嵌入算法,算法描述如下:

输入:扩频水印信号 、原始彩色图片 和 嵌入强度输出:嵌入水印后的图片

算法步骤:

1.取图像 的每一个颜色通道 ,进行以下操作:

1.计算图像通道的 DCT 变换,得到 DCT 矩阵

2.将 DCT 矩阵按之字形展开,得到一维向量,之字形展开如下图所示

import randomfrom random import randint# makeprime.py Copy From:# /qq_36944952/article/details/103973849# w表示希望产生位数,生成目标位数的伪素数def pro_bin(w):li = ['1']for _ in range(w - 2):c = random.choice(['0', '1'])li.append(c)li.append('1') # 最低位定为1res = int(''.join(li), 2)return resdef x_n_mod_p(base, exponent, n):bin_array = bin(exponent)[2:][::-1]r = len(bin_array)base_array = []pre_base = basebase_array.append(pre_base)for _ in range(r - 1):next_base = (pre_base * pre_base) % nbase_array.append(next_base)pre_base = next_basea_w_b = __multi(base_array, bin_array, n)return a_w_b % ndef __multi(array, bin_array, n):result = 1for index in range(len(array)):a = array[index]if not int(bin_array[index]):continueresult *= aresult = result % nreturn resultdef miller_rabin(a, p):if x_n_mod_p(a, p - 1, p) == 1:u = (p - 1) >> 1while (u & 1) == 0:t = x_n_mod_p(a, u, p)if t == 1:u = u >> 1else:if t == p - 1:return Trueelse:return Falseelse:t = x_n_mod_p(a, u, p)if t == 1 or t == p - 1:return Trueelse:return Falseelse:return False# k为测试次数,p为待测奇数def test_miller_rabin(p, k):while k > 0:a = randint(2, p - 1)if not miller_rabin(a, p):return Falsek = k - 1return True# 产生 w 位的素数def make_prime(w):while 1:d = pro_bin(w)# 伪素数附近50个奇数都没有真素数的话,重新再产生一个伪素数u = Falseb = 0for i in range(50):u = test_miller_rabin(d + 2 * i, 5)if u:b = d + 2 * ibreakelse:continueif u:return belse:continueif __name__ == "__main__": # 测试print(make_prime(1024))

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。