随机数检测(四)

news2025/2/22 13:39:40

随机数检测(四)- 累加和检测、近似熵检测、线性复杂度检测、Maurer通用统计检测、离散傅里叶检测

    • 3.12 累加和检测方法
    • 3.13 近似熵检测方法
    • 3.14 线性复杂度检测
    • 3.15 Maurer通用统计检测
    • 3.16 离散傅里叶检测方法

如果商用密码产品认证中遇到问题,欢迎加微信symmrz或13720098215沟通。

3.12 累加和检测方法

累加和检测方法如下图。
累加和检测方法
以下实现代码供参考。


def cusum(epsilon:bitarray, direction):

    n = int(len(epsilon))
    X = [0]*n
    S = [0]*n
    epsilonList = epsilon.tolist()
    for i in range(n):
        X[i]=2*epsilonList[i]-1
    if direction == 0:#forward cumum
        
        S[0] = X[0]
        SMax = abs(S[0])
        for i in range(1,n):
            S[i] = S[i-1]+X[i]
            if abs(S[i]) > SMax:
                SMax = abs(S[i])
    else:#backward cusunm
        S[0] = X[n-1]
        SMax = abs(S[n-1])
        for i in range(1,n):
            S[i] = S[i-1]+X[n-1-i]
            if abs(S[i]) > SMax:
                SMax = abs(S[i])
    sum1 = 0.0
    for i in range(int((1-(n/SMax))/4), int(((n/SMax)-1)/4)):
        sum1 += norm.cdf((4*i + 1)*SMax/sqrt(n)) - norm.cdf((4*i - 1)*SMax/sqrt(n))
    sum2 = 0.0
    for i in range(int((-3-(n/SMax))/4), int(((n/SMax)-1)/4)):
        sum2 += norm.cdf((4*i + 3)*SMax/sqrt(n)) - norm.cdf((4*i + 1)*SMax/sqrt(n))
    pvalue =  1.0 - sum1 + sum2
    qvalue = pvalue
    return {'p':pvalue, 'q':qvalue}

3.13 近似熵检测方法

近似熵检测方法如下图。
近似熵检测方法1
近似熵检测2
以下实现代码供参考。

def getselfCorrelationM(len):
    if len < 100000000:
        m = [2,5]
    else:
        m = [5,7]
    return m    

def alterOffsetBit(m, offset, listSub:list):
    ret = []
    listSub[offset] = 0
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))

    listSub[offset] = 1
    if offset == (m-1):
        ret.append(listSub.copy())
    else: 
        ret += (alterOffsetBit(m, offset+1, listSub))
    return ret
    

def seedSequence(m):
    sequencelist = [0]*m
    return alterOffsetBit(m, 0, sequencelist)

def getPhyN(epsilonList:list, mlen):
    n = len(epsilonList)
    prefixM = epsilonList[:mlen-1:1]
    epsilonList += prefixM

    Vm = getV(epsilonList, mlen)
    C = [Vm[i]/n for i in range(2**mlen)]
    
    phy_mlist = [C[i]*math.log(C[i],math.e) for i in range(2**mlen)]
    return sum(phy_mlist)
    
def getV(epsilonList:list, mlen):
    seedList = seedSequence(mlen)
    V = [0] * (2**mlen)
    for i in range(len(epsilonList)-mlen+1):
        seedindex = seedList.index(epsilonList[i:i+mlen:1])
        V[seedindex] += 1
    return V

def approximateEntropy(epsilon:bitarray,m):
    n = int(len(epsilon))
    epsilonList = epsilon.tolist()
    
    apen_m =  getPhyN(epsilonList, m) - getPhyN(epsilonList, m+1) 
    V = 2.0*n*(math.log(2,math.e) - apen_m)
    pvalue = scipy.special.gammaincc(2**(m-1), V/2)
    qvalue = pvalue
    return {'p':pvalue, 'q':qvalue}

3.14 线性复杂度检测

线性复杂度检测方法如下图。
线性复杂度检测1
现行复杂度检测2
以下实现代码供参考。

def linearComplexity(len):
    if len < 100000000:
        m = [500,1000]
    else:
        m = [5000]
    return m    

def Berlekamp_Massey_algorithm(sequence):
    N = len(sequence)
    s = sequence[:]

    for k in range(N):
        if s[k] == 1:
            break
    f = set([k + 1, 0])
    l = k + 1

    g = set([0])
    a = k
    b = 0

    for n in range(k + 1, N):
        d = 0
        for ele in f:
            d ^= s[ele + n - l]

        if d == 0:
            b += 1
        else:
            if 2 * l > n:
                f ^= set([a - b + ele for ele in g])
                b += 1
            else:
                temp = f.copy()
                f = set([b - a + ele for ele in f]) ^ g
                l = n + 1 - l
                g = temp
                a = b
                b = n - l + 1
   
    return l#(print_poly(f), l)

def getV(epsilonList:list, N:int, M:int):
    V = [0]*7
    mean = M/2.0 + (9.0+1)/36.0 - 1.0/(2**M) * (M/3.0 + 2.0/9.0)
    temp = [0]*M
    for ii in range(N):
        B_ = [0]*M
        C = [0]*M
        T = [0]*M
        P = [0]*M
        # print('loop N', ii)
        L = 0
        m = -1
        d = 0
        C[0] = 1
        B_[0] = 1
        
        for N_ in range(M):
            d = epsilonList[ii*M+N_]
            for i in range(1,L+1):
                d += C[i] * epsilonList[ii*M+N_-i]
            d = d%2
            if d == 1:
                T = C.copy()
                P = temp.copy()
                for j in range(M):
                    if B_[j] == 1:
                        P[j+N_-m] = 1
                for i in range(M):
                    C[i] = (C[i] + P[i])%2
                if L <= int(N_/2) :
                    L = N_ + 1 - L
                    m = N_
                    B_ = T.copy()
        
        T_ = (L - mean) + 2.0/9.0

        if T_ <= -2.5:
            V[0]+=1
        elif  T_ > -2.5 and T_ <= -1.5:
            V[1]+=1
        elif  T_ > -1.5 and T_ <= -0.5:
            V[2]+=1
        elif  T_ > -0.5 and T_ <= 0.5:
            V[3]+=1
        elif  T_ > 0.5 and T_ <= 1.5:
            V[4]+=1
        elif  T_ > 1.5 and T_ <= 2.5:
            V[5]+=1
        else:
            V[6]+=1
    return V
    
def linearComplexity(epsilon:bitarray,m):

    n = len(epsilon)
    N = int(len(epsilon)/m)
    epsilonList = epsilon.tolist()
    
    L = [ Berlekamp_Massey_algorithm(epsilonList[i*m:(i+1)*m]) for i in range(N)]
    mu = (m/2) + (9 + (-1)**(m+1))/36 - (m/3 + 2/9)/(2**m)
    T = [((-1)**m)*(L[i] - mu) + 2/9 for i in range(N)]
    V = [0]*7
    for i in range(N):
        if T[i] <= -2.5:
            V[0] += 1
        elif T[i] <= -1.5 and T[i] > -2.5:
            V[1] += 1
        elif T[i] <= -0.5 and T[i] > -1.5:
            V[2] += 1
        elif T[i] <= 0.5 and T[i] > -0.5:
            V[3] += 1
        elif T[i] <= 1.5 and T[i] > 0.5:
            V[4] += 1 
        elif T[i] <= 2.5 and T[i] > 1.5:
            V[5] += 1
        elif T[i] > 2.5:
            V[6] += 1
    pi = [0.010417, 0.03125, 0.12500, 0.5000, 0.25000, 0.06250, 0.020833]
    resultV = [((V[i] - N*pi[i])**2)/(N*pi[i]) for i in range(7)]
    pvalue = scipy.special.gammaincc(3, sum(resultV)/2)
    qvalue = pvalue
    return {'p':pvalue, 'q':qvalue}

3.15 Maurer通用统计检测

Maurer通用统计检测方法如下图。
maurer通用统计检测1
maurer通用统计检测2
以下实现代码供参考。

expected_value = [0, 0, 0, 0, 0, 0, 5.2177052, 6.1962507, 7.1836656,
                8.1764248, 9.1723243, 10.170032, 11.168765,
                12.168070, 13.167693, 14.167488, 15.167379]
variance = [ 0, 0, 0, 0, 0, 0, 2.954, 3.125, 3.238, 3.311, 3.356, 3.384,
                3.401, 3.410, 3.416, 3.419, 3.421 ]

def getLQ(n:int):
    
    if  n >= 1000000:
        return (7,1280)
    else:
        return (7,1280)
    

def universal(epsilon:bitarray, L):

    n = len(epsilon)
    # (L,Q) = getLQ(n)
    Q = 10*(2**L)
    K = int(n/L)-Q
    p = 2**L
    c = 0.7 - 0.8/L + (4 + 32/L)*(K**(-3/L))/15
    sigma = c * sqrt(variance[L]/K)
    sqrt2 = sqrt(2)
    sum = 0.0
    T = [0]*p
    for i in range(1,Q+1):    
        decRep = 0
        for j in range(L):
            decRep = (decRep << 1) + epsilon[(i-1)*L + j]

        T[decRep] = i
    for i in range(Q+1, Q+K+1):
        decRep = 0
        for j in range(L):
            decRep = (decRep << 1) + epsilon[(i-1)*L + j]
        sum += np.log2(i - T[decRep])
        T[decRep] = i
    
    phi =(sum/K)
    V = (phi-expected_value[L])/sigma
    pvalue = math.erfc(abs(V)/sqrt2)
    qvalue = math.erfc(V/sqrt2)/2
    return {'p':pvalue, 'q':qvalue}

3.16 离散傅里叶检测方法

离散傅里叶检测方法如下图。
离散傅里叶检测方法1
离散傅里叶检测方法2
以下实现代码供参考。

def discreteFourierTransform(epsilon:bitarray):

    n = len(epsilon)
    X = [2*epsilon[i]-1 for i in range(n)]
    f = np.fft.fft(X)
    m = [abs(i) for i in f[0:int(n/2)]]
    count = 0
    upperBound = sqrt(2.995732274*n)
    for i in range(int(n/2)):
        if m[i] < upperBound:
            count +=1
    N_l = count
    N_o = int(0.95*n/2.0)
    d = (N_l - N_o)/sqrt(n/3.8*0.95*0.05)

    pvalue = math.erfc(abs(d)/sqrt(2))
    qvalue = math.erfc(d/sqrt(2))/2

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/759883.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python应用实例(二)数据可视化(四)

数据可视化&#xff08;四&#xff09;下载数据 1.CSV文件格式1.1 分析CSV文件头‘1.2 打印文件头及其位置1.3 提取并读取数据1.4 绘制温度图表1.5 在图表中添加日期 从网上下载数据&#xff0c;并对其进行可视化。网上的数据多得令人难以置信&#xff0c;大多未经仔细检查。如…

智能车打开usb相机和激光雷达录制数据包的过程记录

首先&#xff0c;智能车的遥控器启动之后&#xff0c;要解除驻车挡位&#xff08;尾灯不亮红色才可以&#xff09;&#xff0c;然后右上角的那个拨杆是喇叭&#xff0c;对应的左上角的那个拨杆是控制挡位的&#xff0c;包括前进档&#xff0c;后退档。假如是前进&#xff0c;往…

【我们一起60天准备考研算法面试(大全)-第十五天 15/60】【摩尔投票法】

专注 效率 记忆 预习 笔记 复习 做题 欢迎观看我的博客&#xff0c;如有问题交流&#xff0c;欢迎评论区留言&#xff0c;一定尽快回复&#xff01;&#xff08;大家可以去看我的专栏&#xff0c;是所有文章的目录&#xff09;   文章字体风格&#xff1a; 红色文字表示&#…

CSAPP Lab入门探索

此为记录 虚拟机准备工作 下载VMware 直接在浏览器中搜索VMware Workstation即可 等待 安装就是直接下一步下一步即可&#xff0c;那个安装路径也改下&#xff0c;默认是装在系统盘中 许可证: 直接在百度中搜索VMware Workstation 17 Pro密钥大全即可 这里给出一个参考的&…

人体姿态估计动作识别调研报告

人体姿态估计&动作识别 视频演示 Refs: https://www.zhihu.com/zvideo/1227562268420235264 姿态估计与行为识别&#xff08;行为检测、行为分类&#xff09;的区别 Refs&#xff1a;姿态估计与行为识别&#xff08;行为检测、行为分类&#xff09;的区别 姿态估计 定…

两分钟倒计时 - 啊哈C语言 第4章第5节

题目要求&#xff1a; 尝试编写一个两分钟的倒计时&#xff0c;形如&#xff1a;2:00 1:59 1:58 … 1:00 0:59 0:58 … 0:02 0:01 0:00 代码&#xff1a; #include<stdio.h> #include<stdlib.h> #include<windows.h> int main(){int a2,b0;while(a>0 &…

SpringMVC的XML配置解析-spring18

SpringMVC的有很多组件&#xff1a;&#xff08;这些我们都可以用配件进行配置&#xff09; 1、充沛器 2、映射器 3、视图解析器 默认情况下他们要使用哪个组件&#xff0c;我们可以挖一下&#xff1a; 第一个重叠器映射器 第二个 重叠器适配器 第三个 视图适配器 打开看…

Vue生命周期详解学习笔记

生命周期 生命周期又名生命周期回调函数&#xff0c;生命周期函数&#xff0c;生命周期钩子。生命周期是Vue在关键时刻帮我们调用的一些特殊名称的函数。生命周期函数的名字不可更改&#xff0c;但函数的具体内容是程序员根据需求编写的。生命周期中的this指向vm或组件实例对象…

【PHP面试题48】Redis的事务?事务都有哪些注意的地方?

文章目录 一、关于事务1.1 事务的概念和优势1.2 Redis事务的基本用法 二、Redis事务的注意事项2.1 使用WATCH监视关键变量2.2 避免长时间事务2.3 避免事务中的循环2.4 处理事务执行结果2.5 考虑使用管道2.6 使用合适的事务隔离级别2.7 考虑事务的并发性2.8 监控事务执行情况 总…

项目管理进度管理神器:有效方法分享

在项目管理中&#xff0c;进度管理是至关重要的环节&#xff0c;它可以帮助项目团队及时发现和解决问题&#xff0c;确保项目按计划顺利进行。一个有效的进度管理方案需要考虑多方面的因素&#xff0c;包括任务分解、时间控制、资源分配、风险管理等。 如何有效的管理项目进度&…

剑指 Offer 68 - II. 二叉树的最近公共祖先

题目介绍 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个结点 p、q&#xff0c;最近公共祖先表示为一个结点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以…

FL Studio2023最新中文版混音编曲宿主软件及电脑配置要求

现在大部分音乐的制作过程都是在宿主软件中完成的&#xff0c;宿主软件又称数字音频工作站&#xff0c;简写为DAW软件。目前市面上有非常多的宿主软件供大家选择&#xff0c;例如Cubase、Logic Pro以及我一直使用的FL Studio。每款不同的宿主软件都有不同的优缺点&#xff0c;所…

MFC第十七天 CFont类与LOGFONT结构体、记事本文件打开和保存及是否保存的逻辑流程分析、PreTranslateMessage虚函数与快捷键

文章目录 CFont类与LOGFONT结构体CFontDialog字体信息结构体与HFONT句柄的关系 记事本文件拖入、打开和保存及是否保存的逻辑流程分析PreTranslateMessage虚函数与快捷键附录 CFont类与LOGFONT结构体 CFontDialog 构造函数介绍 public: //用于指定字体对话框的初始字体属性&…

C# Modbus通信从入门到精通(4)——Modbus RTU(0x02功能码)

1、02(0x02)读线圈输入 使用该功能码能从远程地址中读取1到2000个输入线圈的状态,每个线圈的状态只能是0或者1,读取的线圈数量由主站读取时指定。 2、发送报文格式 更详细的格式如下: 从站地址+功能码+起始地址高位+起始地址低位+线圈数量高位+线圈数量低位+CRC,一共8个…

Linux进程理解【程序地址空间】

Linux进程理解【程序地址空间】 文章目录 Linux进程理解【程序地址空间】1. 话题引入2. 进程地址空间2.1 虚拟地址2.2 写时拷贝 3. 知识扩展 我们先来看看C/C程序地址空间的分布图 如此多区域的划分是为了更好的使用和管理空间&#xff0c;但是真实的内存空间也是按照图上的地址…

nginx的下载与安装

https://nginx.org/en/download.html 下载地址&#xff08;我下载的是1.20.2&#xff09; 1、首先保证可以连接外网 2、将包拖入opt/nginx 3、安装gcc环境 &#xff08;如果出现问题可以参考https://www.cnblogs.com/lzxianren/p/4254059.html&#xff09; yum -y install gc…

你还在手动对比代码差异?这些高质量工具太香了

B站|公众号&#xff1a;啥都会一点的研究生 我发现相当一部分初学者&#xff08;甚至搬砖多年的老同志&#xff09;在对比文件差异的时候居然还是 观察法 文本内容少还凑活能用&#xff0c;成百上千行的时候把眼睛累坏了不说&#xff0c;关键还容易漏信息 接触的人与事多了会…

volatile的可见性探讨

我跟volatile修饰对象和数组能保证其内部元素的可见性&#xff1f;一文的作者有类似的疑惑&#xff0c;按语义&#xff0c;volatile修饰数组时&#xff0c;只是保证其引用地址的可见性&#xff0c;可为什么给数组加了volatile之后&#xff0c;似乎单个数组元素也有了可见性&…

Android Glide同步阻塞方式submit获得Bitmap,kotlin

droid Glide同步阻塞方式submit获得Bitmap&#xff0c;kotlin 需要放入后台线程&#xff0c;不能在主线程。 Android Glide预加载preload ,kotlin_zhangphil的博客-CSDN博客【代码】Android Paging 3,kotlin&#xff08;1&#xff09;在实际的开发中&#xff0c;虽然Glide解决了…

AC+AP 旁挂式连接配置(华为)

AR1路由器配置 # interface GigabitEthernet0/0/0 ip address 10.1.30.1 255.255.255.0 ip route-static 10.1.20.0 255.255.255.0 10.1.30.2 # LSW1核心交换机 # dhcp enable vlan batch 10 20 30 interface Vlanif20 ip address 10.1.20.1 255.255.255.0 dhcp select in…