首页
学习
活动
专区
圈层
工具
发布
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    信息安全: MAC(消息认证码)算法,保护数据完整性和真实性的利器

    CMAC(基于块密码的消息认证码): 使用块加密算法(如 AES)生成 MAC 值。 常用于无线通信和支付系统中。...详细介绍 CMAC 的结构 CMAC 使用块加密算法(如 AES)进行运算,具体步骤如下: 使用密钥对零块进行加密,生成一个中间密钥 K1。...对 K1 进行左移操作,并根据最高位的值对生成的值进行异或操作,得到第二个中间密钥 K2。 将消息分成若干块,对每个块进行加密,最后一块使用 K1 或 K2 进行加密。...值: {cmac_value}") 结论 MAC 算法在保证数据完整性和真实性方面扮演着重要角色。...HMAC 和 CMAC 作为两种主要的 MAC 算法,因其高安全性和广泛应用,已经成为现代通信和数据保护中不可或缺的一部分。

    1.2K10

    密码库LibTomCrypt学习记录——(2.12)分组密码算法的工作模式——OMAC认证模式

    而NIST SP 800-38B 中涉及的CMAC其实就是OMAC1。因此,OMAC采用的基本模式是用改进的CBC模式得到MAC值,主要调整是子密钥的生成和最后一个分组的padding上。...子密钥生成 记加密算法为CIPH,其分组大小为b比特;密钥记为K;输出子密钥为K1和K2。子密钥生成步骤如下: step 1. L = CIPHK(0b). step 2....If MSB1(K1) = 0, then K2 = K1 << 1; Else K2 = (K1 << 1) ⊕ Rb. step 4. Return K1, K2....这样一来,两个子密钥的来历就是: 子密钥生成的流程图(生成子密钥K1和K2) MAC生成 记加密算法为CIPH,其分组大小为b比特;密钥记为K;输入消息为Mlen比特长的M,输出MAC值为Tlen比特长的...MAC生成CMAC(K, M, Tlen)(也可以记为CMAC(K, M))步骤如下: step 1. 使用子密钥生产算法生成子密钥K1和K2; step 2.

    1K30

    消息认证码(MAC)解读

    特定HMAC实现需要选择一个特定的hash函数。这些不同的HMAC实现通常标记为:HMAC-MD5,HMAC-SHA1, HMAC-SHA256等等....上图是omac算法的执行过程,为了使用b比特块密码(E)和秘密密钥(k)生成消息(m)的l比特CMAC标签(t),首先生成两个b比特子密钥(k1和k2)使用以下算法(这相当于在有限域GF(2b)中乘以x...(具体来说,C是按字典顺序排列的第一个不可约度-b二元多项式的非前导系数,具有最小数量的1:64位为0x1B,128位为0x87,256位为0x425) 3.如果msb(k1)= 0,则k2 = k1...k2 =(k1 << 1)⊕C 4.返回MAC生成过程的密钥(k1,k2) 作为一个小例子,假设 b = 4,C = 00112,并且k0 = Ek(0)= 01012。...然后k1 = 10102并且k2 =0100⊕0011= 01112。 CMAC标签生成过程如下: 1.将消息分成b位块m =m1∥…∥mn-1∥mn,其中m1,…,mn-1是完整的块。

    3.4K10

    设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。满足这种要求的

    题目: 设线性表中每个元素有两个数据项k1和k2,现对线性表按一下规则进行排序:先看数据项k1,k1值小的元素在前,大的在后;在k1值相同的情况下,再看k2,k2值小的在前,大的在后。...满足这种要求的排序方法是( ) A.先按k1进行直接插入排序,再按k2进行简单选择排序 B.先按k2进行直接插入排序,再按k1进行简单选择排序 C.先按k1进行简单选择排序,再按k2进行直接插入排序...D.先按k2进行简单选择排序,再按k1进行直接插入排序 答题思路: 首先我们要明确题意,这一题的排序是针对k1和k2全体进行的,而不是说我排好k1后,再对每组相同的k1进行k2的排序。...这说明k1排序的优先级要比k2高,如果我们对k1先进行排序,后面对k2进行排序时就会打乱之前k1的排序。所以排序顺序是k2、k1。...k1 选择排序之前: 标识 k1 k2 1 50 70 2 40 70 3 50 80 4 40 80 k1 选择排序之后: 标识 k1 k2 1 40 70 2 40 80 3 50 80 4 50

    58510

    斯坦福大学密码学-抗碰撞 06

    回顾上一部分介绍的四种MAC: MAC系统是安全的,即在选择消息攻击下,是不可被存在性伪造的。 任何一个安全的PRF都能给我们一个安全的MAC。 基于CBC的MAC:两种变形:ECBC,CMAC。...NMAC和CBC-MAC 都是串行的。PMAC是并行的。 Carter-Wegman MAC不是基于PRFs,它是一个随机MAC。所以单个信息可以有许多不同的标签。...ipad 和opad,是固定的常数。512位常数,永不改变。 HMAC和NMAC不同之处在于,HMAC的密钥是互相有关联的。只是同样的密钥k异或上不同的常量。...所以k1和k2也是互相有关联的,它们是在同样的固定值IV上应用PRF计算得到的。...为了证明k1和k2是伪随机的且相互独立的,我们必须证明压缩函数不仅当它上面的输入是密钥时,它是PRF,也要证明当它使用关联密钥时,它也是PRF。

    2.1K41

    为什么有人选择和AI结婚?

    从美国到日本再到欧洲等地,已有人选择与AI建立深度情感关系,这种人机之间的畸恋或许反映了现代人的交际困境,也带来了深刻的哲学反思与争议。...根据相关调查显示,日本22%的中学女生表现出“虚构浪漫”倾向,而在每周使用AI的人群中,聊天机器人比母亲或好友更常被选择为情感倾诉对象。...这些案例共同展示了一个趋势:AI已经从单纯的工具逐步成为情感参与者,并深刻影响人类的情感结构和行为模式。这一趋势背后,技术和心理机制紧密交织。...法律如何界定非人类伴侣的权利和义务?伦理和社会规范又该如何适应这种新型人机关系?在心理学角度看,AI伴侣的存在提供了独特的情绪稳定性,但过度依赖仍可能削弱人们面对现实复杂关系的耐心和处理能力。...为什么他们会爱上AI伴侣AI亲密关系之所以独特,在于技术本身深刻影响着人类的情感认知和心理体验。

    15410

    attention计算过程的一些细节

    最近,有粉丝问我,attention结构中计算qkv的时候,为什么要做kvcache呢?他看了一些文章,没看懂。为什么要做kvcache?...q1*k1, q1*k2 q2*k1, q2*k2]然后需要做一个mask,只留下下三角的值,其他值都取0,得到:[q1*k1, 0 q2*k1, q2*k2]为什么要做mask,我认为是要和训练时的规则保持一致...而第3行的值是q3*[k1, k2, k3],所以为了避免重复计算,我们只需要在第2次计算的时候,只计算新token对应的q3和k3,然后把k3和第1次计算得到的[k1, k2]拼接起来即可,[k1,...这里又引入了另一个问题,既然在首次计算时,只用到了最后一个分量,为什么还要计算qk和qkv的第1到第L-1个分量的值呢?这是因为大模型由多个decoder layer叠加组成。...*v1, q2*k1*v1+q2*k2*v2]它的最后一个分量是q2*k1*v1+q2*k2*v2,其中的k1、v1都和h1相关,所以做首次计算(也就是我们常说的全量计算)时,qk和qkv的每个分量都要计算

    21810

    为什么要重写 hashcode 和 equals 方法?

    在第25行里,我们通过put方法把k1和一串字符放入到hm里;而在第26行,我们想用k2去从HashMap里得到值;这就好比我们想用k1这把钥匙来锁门,用k2来开门。...由于k1和k2是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的hash值一定不同,这就是我们无法用k2的hash值去拿k1的原因。...当我们把第16和17行的hashCode方法的注释去掉后,会发现它是返回id属性的hashCode值,这里k1和k2的id都是1,所以它们的hash值是相等的。 我们再来更正一下存k1和取k2的动作。...但k1有可能仅仅是和k2具有相同的hash值,但未必和k2相等(k1和k2两把钥匙未必能开同一扇门),这个时候,就需要调用Key对象的equals方法来判断两者是否相等了。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然在26行通过hm.get(k2)依然得到null的原因。

    50010

    我们为什么放弃 MongoDB 和 MySQL,选择 TiDB

    为什么放弃 MongoDB?...有事务需求的场景不多:当时使用的是 MongoDB 2.x 和 3.x,只提供了数据一致性的选择(强一致性、单调一致性和最终一致性)和原子操作,在少数的几个场景,比如交易相关的场景,通过选择强一致性和原子操作...为什么不选择 MySQL?...经过对 TiDB 的调研、试用和深入交流后,在传统的关系型数据库 MySQL 和 NewSQL 数据库 TiDB 之间,我们需要做出自己的选择了,这不仅仅是两个数据库之间的选择,这其实也体现了伴鱼对新技术的态度...另一方面,在选择面向未来、优雅高效的解决方案,还是选择成熟的但不够优雅和高效的解决方案,如果选择成熟的解决方案,对技术的掌控会比较高,但是会在效率方面持续的进行付出;如果选择面向未来的解决方案,需要花时间和精力来掌握新技术

    1.1K20

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...由于k1和k2是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的hash值一定不同,这就是我们无法用k2的hash值去拿k1的原因。...当我们把第16和17行的hashCode方法的注释去掉后,会发现它是返回id属性的hashCode值,这里k1和k2的id都是1,所以它们的hash值是相等的。 我们再来更正一下存k1和取k2的动作。...但k1有可能仅仅是和k2具有相同的hash值,但未必和k2相等(k1和k2两把钥匙未必能开同一扇门),这个时候,就需要调用Key对象的equals方法来判断两者是否相等了。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然在26行通过hm.get(k2)依然得到null的原因。

    54320

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...由于k1和k2是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的hash值一定不同,这就是我们无法用k2的hash值去拿k1的原因。...当我们把第16和17行的hashCode方法的注释去掉后,会发现它是返回id属性的hashCode值,这里k1和k2的id都是1,所以它们的hash值是相等的。 我们再来更正一下存k1和取k2的动作。...但k1有可能仅仅是和k2具有相同的hash值,但未必和k2相等(k1和k2两把钥匙未必能开同一扇门),这个时候,就需要调用Key对象的equals方法来判断两者是否相等了。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然在26行通过hm.get(k2)依然得到null的原因。

    53330

    为什么要重写hashcode和equals方法?初级程序员在面试中很少能说清楚。

    2 为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...由于k1和k2是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的hash值一定不同,这就是我们无法用k2的hash值去拿k1的原因。...我们再来更正一下存k1和取k2的动作。存k1时,是根据它id的hash值,假设这里是100,把k1对象放入到对应的位置。...但k1有可能仅仅是和k2具有相同的hash值,但未必和k2相等(k1和k2两把钥匙未必能开同一扇门),这个时候,就需要调用Key对象的equals方法来判断两者是否相等了。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然在26行通过hm.get(k2)依然得到null的原因。

    47660

    一文读懂数据库优化之分库分表

    阅读此文你将了解: 什么是分库分表以及为什么分库分表 如何分库分表 分库分表常见几种方式以及优缺点 如何选择分库分表的方式 数据库常见优化方案 对于后端程序员来说,绕不开数据库的使用与方案选型,那么随着业务规模的逐渐扩大...= K1 / D 扩容后: 如果M为偶数,即M= 2*N K2 = H% (2DT) = (2NDT+K1)%(2DT) = K1%(2DT) ,K1 一定小于(2DT),所以K2=K1 D2 = K2%...+K1)%(2DT) = DT + K1 D2 = K2 %(2D) = (DT+K1) % (2D) T2 = K2 /(2D) = (DT+K1) / (2D) 结论:扩容后库序号和表序号都变化...K2=K1 D2 = K2/T  = K1 /T = D1 T2 = K2%T = K1 % T = T1 如果M为奇数,即M = 2*N+1 K2 = H%(2DT) = (2NDT +DT +K1...同时,对于写入操作可以采用随机选择或者顺序选择一个库表进入写入。 那么由于路由关系表的存在,我们在数据扩容时,无需迁移历史数据。

    2.2K51

    为什么要重写 hashcode 和 equals 方法?

    为什么要重写equals和hashCode方法 当我们用HashMap存入自定义的类时,如果不重写这个自定义类的equals和hashCode方法,得到的结果会和我们预期的不一样。...由于k1和k2是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的hash值一定不同,这就是我们无法用k2的hash值去拿k1的原因。...当我们把第16和17行的hashCode方法的注释去掉后,会发现它是返回id属性的hashCode值,这里k1和k2的id都是1,所以它们的hash值是相等的。 我们再来更正一下存k1和取k2的动作。...但k1有可能仅仅是和k2具有相同的hash值,但未必和k2相等(k1和k2两把钥匙未必能开同一扇门),这个时候,就需要调用Key对象的equals方法来判断两者是否相等了。...由于Object的固有方法是根据两个对象的内存地址来判断,所以k1和k2一定不会相等,这就是为什么依然在26行通过hm.get(k2)依然得到null的原因。

    73320

    超硬核解析Apache Hudi 的一致性模型(第三部分)

    例如:{k1, k2} • 值。例如:{A, B} • 单调Ts • True = 单调 ts 提供程序:例如 ZK。 • False = 非确定性本地时钟:发出介于 1 和单调值之间的值。...让我们深入了解其中的一些场景,以了解为什么每种场景都是安全的或不安全的。...在进行暴力检查时,模型检查器实际上会探索每个操作的 1 和最低单调值之间的所有时间戳值。 图 4.两位写入端都选择了时间戳 ts=1。...在 ts=3 时,读取器在一遍又一遍地重复其查询时会看到以下结果: • k1=空,k2=空 • k1=A, k2=空 • k1=A,k2=X • k1=B,k2=X 在 ts=4 时,读取器在一遍又一遍地重复其查询时会看到以下结果...: • k1=空,k2=空 • k1=A, k2=空 • k1=A,k2=X • k1=A, k2=Y k1=B 之前看到 ts=4 的 k2=Y • k1=B,k2=Y 在 ts

    48810

    为什么要重写 hashCode 和 equals 方法?

    为什么要重写 equals 和 hashCode 方法 当我们用 HashMap 存入自定义的类时,如果不重写这个自定义类的 equals 和 hashCode 方法,得到的结果会和我们预期的不一样。...由于 k1 和 k2 是两个不同的对象,所以它们的内存地址一定不会相同,也就是说它们的 hash 值一定不同,这就是我们无法用 k2 的 hash 值去拿 k1 的原因。...但是问题还没有结束,我们再来更正一下存 k1 和 取 k2 的动作。存 k1 时,是根据它 id 的 hash 值,假设这里是 103,把 k1 对象放入到对应的位置。...但 k1 有可能仅仅是和 k2 具有相同的 hash值,但未必和 k2 相等,这个时候,就需要调用 HashMapKey 对象的 equals 方法来判断两者是否相等了。...和 k2 一定不会相等,这就是为什么通过 map.get(k2) 依然得到 null 的原因。

    67120
    领券