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

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

  1. 算法原理 1
    1.1 RSA 原理概述 1
    用中国剩余定理CRT对RSA运算进行加 2
  2. 代码实现 2
    2.1 RSA 代码实现 2
    2.2 CRT-RSA 代码实现 4
  3. 算法效果对比 5
    第 二部分 图像数字水印技术 5
  4. 数字水印算法思路 5
  5. 计算图像通道的 DCT 变换,得到 DCT 矩阵 6
  6. 遍历每一个分块: 7
  7. 最后将各通道聚合在一起,得到嵌入水印的彩色图片,并输出。 8
    1.3 数字水印检测与验证 8
  8. 代码实现 8
  9. 代码测试 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 random
from random import randint

# makeprime.py Copy From:
# https://blog.csdn.net/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')  # 最低位定为1
    res = int(''.join(li), 2)
    return res


def x_n_mod_p(base, exponent, n):
    bin_array = bin(exponent)[2:][::-1]
    r = len(bin_array)
    base_array = []

    pre_base = base
    base_array.append(pre_base)

    for _ in range(r - 1):
        next_base = (pre_base * pre_base) % n
        base_array.append(next_base)
        pre_base = next_base

    a_w_b = __multi(base_array, bin_array, n)
    return a_w_b % n


def __multi(array, bin_array, n):
    result = 1
    for index in range(len(array)):
        a = array[index]
        if not int(bin_array[index]):
            continue
        result *= a
        result = result % n
    return result


def miller_rabin(a, p):
    if x_n_mod_p(a, p - 1, p) == 1:
        u = (p - 1) >> 1
        while (u & 1) == 0:
            t = x_n_mod_p(a, u, p)
            if t == 1:
                u = u >> 1
            else:
                if t == p - 1:
                    return True
                else:
                    return False
        else:
            t = x_n_mod_p(a, u, p)
            if t == 1 or t == p - 1:
                return True
            else:
                return False
    else:
        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 False
        k = k - 1
    return True


# 产生 w 位的素数
def make_prime(w):
    while 1:
        d = pro_bin(w)
        # 伪素数附近50个奇数都没有真素数的话,重新再产生一个伪素数
        u = False
        b = 0
        for i in range(50):
            u = test_miller_rabin(d + 2 * i, 5)
            if u:
                b = d + 2 * i
                break
            else:
                continue
        if u:
            return b
        else:
            continue


if __name__ == "__main__":  # 测试
    print(make_prime(1024))



基于Python实现的RSA加密和解密算法_第1张图片
基于Python实现的RSA加密和解密算法_第2张图片
基于Python实现的RSA加密和解密算法_第3张图片
基于Python实现的RSA加密和解密算法_第4张图片
基于Python实现的RSA加密和解密算法_第5张图片
基于Python实现的RSA加密和解密算法_第6张图片
基于Python实现的RSA加密和解密算法_第7张图片
基于Python实现的RSA加密和解密算法_第8张图片
基于Python实现的RSA加密和解密算法_第9张图片
基于Python实现的RSA加密和解密算法_第10张图片
基于Python实现的RSA加密和解密算法_第11张图片

你可能感兴趣的:(算法,python,机器学习,RSA加密,解密算法)