操作数

论文笔记:公钥密码算法的硬件实现及侧信道攻击研究(RSA部分)

纵饮孤独 提交于 2020-03-03 01:53:39
论文笔记:公钥密码算法的硬件实现及侧信道攻击研究 作者:王晖(天津大学,2017届硕士学位论文) RSA 算法计算流程 1. 密钥对生成(软件实现) • 选取两个大素数 p 和 q; • 计算𝑛 = 𝑝 × 𝑞,以及 n 的欧拉函数𝜙(𝑛) = (𝑝 − 1) ∙ (𝑞 − 1); • 随机选取一个整数𝑒 (1 < 𝑒 < 𝜙(𝑛)),满足𝑔𝑐𝑑(𝑒, 𝜙(𝑛)) = 1; • 计算私钥 d,满足𝑑 × 𝑒 ≡ 1 𝑚𝑜𝑑 𝜙(𝑛); • 其中 n, e 可以公开为公钥;p, q 可以抛弃但不能泄露, d 需要保密 为私钥。 2. 加密过程 • 加密方拥有公钥信息 n, e,首先需要将明文信息数字化,即转换成 二进制数据,保证每次加密明文信息 m 的长度小于log2𝑛; • 加密方对明文 m 进行加密,即进行模幂运算𝑐 = 𝑚^e 𝑚𝑜𝑑 𝑛; • 加密方将加密好的密文 c 通过可信通信渠道发送给解密方。 3. 解密过程 • 解密方拥有私钥信息 d; • 解密方接收密文信息 c; • 解密方对密文 c 进行解密操作,即𝑚 = 𝑐^d 𝑚𝑜𝑑 𝑛。 显然,加解密过程的基本运算单元都是:message = 𝑚𝑒𝑠𝑠𝑎𝑔𝑒^k𝑒𝑦 𝑚𝑜𝑑 𝑛。最后通过设计状态机调用模幂模块,分别能够实现 RSA 的加解密过程。RSA整个模块在 Xilinx ISE 开发环境中基于 Xilinx

字节码执行引擎知识点总结

◇◆丶佛笑我妖孽 提交于 2020-03-02 22:38:24
以下是在学习了《深入理解JVM》之后的对知识点的总结,其中对方法调用那一章做了大量实践和分析。 文章目录 解释型还是编译型 基于栈还是基于寄存器 字节码指令在哪儿 java虚拟机栈与栈帧的关系 局部变量表 操作数栈 动态连接 方法返回地址 栈帧与方法的关系 字节码指令中的四个方法调用指令 invokevirtual指令解析过程 静态分派,重载,编译期确定 动态分派,重写,运行时确定 解释型还是编译型 字节码的执行有解释型和编译型,根据具体情况才能说明java到底是什么执行方式。 基于栈还是基于寄存器 虚拟机是基于栈的指令集,栈指的是java虚拟机栈,指令集指的字节码指令。 字节码指令在哪儿 执行的字节码指令存放在字节码文件里的方法表里的code属性中。 java虚拟机栈与栈帧的关系 虚拟机栈的基本单位为栈帧,栈帧之间的排列是先进后出。每个栈帧包括了局部变量表,操作数栈,动态连接,方法返回地址以及其他一些信息。 每个栈帧的大小在编译期已经决定,因此栈帧中的每个结构都在编译期确定。 虚拟机栈是线程私有,线程结束栈帧的所有内存都会清除。 局部变量表 局部变量表的单位为slot。 一个slot的大小必须要装的下除long,double类型之外其他基本类型,一般4个字节,也就是32位。 对于long,double类型使用两个slot存放。 局部变量表利用索引来获取值,就如同数组一样

java入门

不打扰是莪最后的温柔 提交于 2020-03-02 18:51:27
1.代码 public class HelloWorld{ //HelloWorld为类名必须和文件名相对 public static void main(String[] args){ //main为入口函数 System.out.println("hello world"); // System.out.println为打印 } } /* 一个文件可以有多个class,但是只能一个声明为public,而且public的这个类要跟文件名相同 */ 2.定义类 class 类名{ } 3.注释 //单号注释 /*多行注释*/ 4.定义变量 数据类型 变量名称; 变量名称 = 赋值; //也可以直接这样写 数据类型 变量名称 = 赋值; 5.声明方法 public static void 方法名(传入参数类型 参数名){ //多个参数用,分开 } 6.常用数据类型 //数字 //整数无非是范围问题 int byte short long //结果要加L 比如10 ,10L //小数 float //结果要加F 比如10.1 ,10.1F double //字符串 char //布尔类型 boolean //true或者false //默认情况 System.out.println(1111)//默认int System.out.println(11.11)//默认double /

汇编语言指令英文全称

坚强是说给别人听的谎言 提交于 2020-03-02 17:05:40
1.通用数据传送指令 MOV----> move MOV dest,src;dest←src MOV指令把一个字节或字的操作数从源地址src传送至目的地址dest。 MOVSX---->extended move with sign data MOVZX---->extended move with zero data PUSH---->push POP---->pop 进栈出栈指令 PUSHA---->push all POPA---->pop all PUSHAD---->push all data POPAD---->pop all data BSWAP---->byte swap XCHG---->exchange 交换指令用来将源操作数和目的操作数内容交换,操作数可以是字、也可以是字节,可以在通用寄存器与通用寄存器或存储器之间对换数据,但不能在存储器与存储器之间对换数据。 mov ax,1234h ;ax=1234h mov bx,5678h ;bx=5678h xchg ax,bx ;ax=5678h,bx=1234h xchg ah,al ;ax=7856h CMPXCHG---->compare and change XADD---->exchange and add XLAT---->translate 换码指令用于将BX指定的缓冲区中

Linux

对着背影说爱祢 提交于 2020-03-02 07:40:02
在linux内核的源代码中,以汇编语言编写的程序或程序段,有两种不同的形式。 第一种事完全的汇编代码,这样的代码采用.s作为文件的后缀。事实上,尽管是完全的汇编代码,现代的汇编工具也吸收了C语言的长处,也在汇编之前加上了一趟预处理,而预处理之前的文件则以.s为后缀。此类(.s)文件也和C程序一样,可以使用#include、#ifdef等等成分,而数据结构也一样可以在.h的文件中加以定义。 第二种是嵌在C程序中的汇编语言片断。虽然在ANSI的C语言标准中并没有关于汇编片段的规定,事实上各种实际使用的C编译中都作了这方面的扩充,而 GNU的C编译gcc也在这方面作了很强的扩充。 在DOS/windows领域中,386汇编语言都采用Intel定义的语句格式。可是,在Unix领域中,采用的却是由AT&T定义的格式。 AT&T的汇编与Intel的汇编主要有以下的区别: 在Intel格式中大多使用大写字母,而在AT&T格式中都使用小写字母。 在AT&T格式中,寄存器名要加上“%”作为前缀 ,而在Intel格式中不带前缀。 在AT&T的386汇编语言中,指令的源操作数的顺序与在Intel的386汇编语言中正好相反。 在AT&T格式中,访问指令的操作数的宽度有操作码名称的最后一个字母(操作码的后缀决定)。用作操作码后缀的字母有b(8位)。 w(16位)和1(32位)。 而在Intel格式中

__asm__ __volatile__ GCC的内嵌汇编语法 AT&T汇编语言语法

徘徊边缘 提交于 2020-03-02 06:40:07
开 发一个OS,尽管绝大部分代码只需要用C/C++等高级语言就可以了,但至少和硬件相关部分的代码需要使用汇编语言,另外,由于启动部分的代码有大小限 制,使用精练的汇编可以缩小目标代码的Size。另外,对于某些需要被经常调用的代码,使用汇编来写可以提高性能。所以我们必须了解汇编语言,即使你有可 能并不喜欢它。 如果你是计算机专业的话,在大学里你应该学习过Intel格式的8086/80386汇编,这里就不再讨论。如果我们选择的OS开发工具是GCC以及GAS的话,就必须了解AT&T汇编语言语法,因为GCC/GAS只支持这种汇编语法。 本书不会去讨论8086/80386的汇编编程,这类的书籍很多,你可以参考它们。这里只会讨论AT&T的汇编语法,以及GCC的内嵌汇编语法。 -------------------------------------------------------------------------------- 0.3.2 Syntax 1.寄存器引用 引用寄存器要在寄存器号前加百分号%,如“movl %eax, %ebx”。 80386有如下寄存器: 8个32-bit寄存器 %eax,%ebx,%ecx,%edx,%edi,%esi,%ebp,%esp; 8个16-bit寄存器,它们事实上是上面8个32-bit寄存器的低16位:%ax,%bx,%cx,%dx,%di,

最牛X的GCC 内联汇编

别说谁变了你拦得住时间么 提交于 2020-03-02 05:55:44
1. 简介 1.1 版权许可 Copyright (C) 2003 Sandeep S. 本文档自由共享;你可以重新发布它,并且/或者在遵循自由软件基金会发布的 GNU 通用公共许可证下修改它;也可以是该许可证的版本 2 或者(按照你的需求)更晚的版本。 发布这篇文档是希望它能够帮助别人,但是没有任何担保;甚至不包括可售性和适用于任何特定目的的担保。关于更详细的信息,可以查看 GNU 通用许可证。 1.2 反馈校正 请将反馈和批评一起提交给 Sandeep.S。我将感谢任何一个指出本文档中错误和不准确之处的人;一被告知,我会马上改正它们。 1.3 致谢 我对提供如此棒的特性的 GNU 人们表示真诚的感谢。感谢 Mr.Pramode C E 所做的所有帮助。感谢在 Govt Engineering College 和 Trichur 的朋友们的精神支持和合作,尤其是 Nisha Kurur 和 Sakeeb S 。 感谢在 Gvot Engineering College 和 Trichur 的老师们的合作。 另外,感谢 Phillip , Brennan Underwood 和 colin@nyx.net ;这里的许多东西都厚颜地直接取自他们的工作成果。 2. 概览 在这里,我们将学习 GCC 内联汇编。这里内联表示的是什么呢?

AT&T的汇编格式&X86内联汇编

徘徊边缘 提交于 2020-03-02 04:47:09
AT&T的汇编格式 一 基本语法 语法上主要有以下几个不同. ★ 寄存器命名原则 AT&T: %eax Intel: eax ★源/目的操作数顺序 AT&T: movl %eax,%ebx Intel: mov ebx,eax ★常数/立即数的格式 AT&T: movl $_value,%ebx Intel: mov eax,_value 把_value的地址放入eax寄存器 AT&T: movl $0xd00d,%ebx Intel: mov ebx,0xd00d ★ 操作数长度标识 AT&T: movw %ax,%bx Intel: mov bx,ax ★寻址方式 AT&T: immed32(basepointer,indexpointer,indexscale) Intel: [basepointer + indexpointer*indexscale + imm32) Linux工作于保护模式下,用的是32位线性地址,所以在计算地址时不用考虑segment:offset的问题.上式中的地址应为: imm32 + basepointer + indexpointer*indexscale 下面是一些例子: ★直接寻址 AT&T: _booga ; _booga是一个全局的C变量 注意加上$是表示地址引用,不加是表示值引用. 注:对于局部变量,可以通过堆栈指针引用. Intel

JAVA FX语法学习----运算符

雨燕双飞 提交于 2020-02-29 20:57:18
赋值运算符 赋值运算符 "=" 是您将遇到的最常用的运算符。使用该运算符可以将其右侧的值赋给其左侧的操作数: result = num1 + num2; days = ["Mon","Tue","Wed","Thu","Fri"]; 算术运算符 使用 算术运算符 可以执行加、减、乘和除运算。 mod 运算符用一个操作数除以另一个操作数并将余数作为结果返回。 + (加运算符) - (减运算符) * (乘运算符) / (除运算符) mod (求余运算符) 以下脚本提供了一些示例: var result = 1 + 2; // result is now 3 println(result); result = result - 1; // result is now 2 println(result); result = result * 2; // result is now 4 println(result); result = result / 2; // result is now 2 println(result); result = result + 8; // result is now 10 println(result); result = result mod 7; // result is now 3 println(result);

JAVA FX语法学习----运算符

折月煮酒 提交于 2020-02-29 20:42:29
赋值运算符 赋值运算符 "=" 是您将遇到的最常用的运算符。使用该运算符可以将其右侧的值赋给其左侧的操作数: result = num1 + num2; days = ["Mon","Tue","Wed","Thu","Fri"]; 算术运算符 使用 算术运算符 可以执行加、减、乘和除运算。 mod 运算符用一个操作数除以另一个操作数并将余数作为结果返回。 + (加运算符) - (减运算符) * (乘运算符) / (除运算符) mod (求余运算符) 以下脚本提供了一些示例: var result = 1 + 2; // result is now 3 println(result); result = result - 1; // result is now 2 println(result); result = result * 2; // result is now 4 println(result); result = result / 2; // result is now 2 println(result); result = result + 8; // result is now 10 println(result); result = result mod 7; // result is now 3 println(result);