128位的主密钥:E1F97A0D3E018BE0D64FA32C06DE4139

112位输入矢量:0EC675AD498AFEEBB6960B3AABE6

16位计数器:0000

喂奶时的级联将112位输入向量和16位计数器转换为AES_ctr128_encrypt()我是不是得到预期的输出附录B.3的RFC3711列出了。(根据RFC3711的附录B.3)

预期的密文的输出应该是:

C61E7A93744F39EE10734AFE3FF7A087

实际的密文输出我跟我的代码得到的是: C8D80F3E3DC5C705A6E541C49411A087

(请注意,只有最后的16位与预期的一样)。

这是为什么?我究竟做错了什么?

这里是我的代码: // COMPILE WITH:

// g++ -o aesctr128 -lcrypto aesctr128_test.cpp

#include

#include

#include

struct counter_state

{

unsigned char ivec[16]; // ivec[0..13] (high-order bytes) is 'IV'/ivec[14..15] (low-order bytes) is 'counter'

unsigned int num; // Block byte offset

unsigned char ecount[16];

};

int reset_state(struct counter_state *state, const unsigned char iv[14])

{

// aes_ctr128_encrypt() requires 'num' and 'ecount' to be set to zero on its first call

state->num = 0;

memset(state->ecount, 0, 16);

// Clear BOTH 14 high-order bytes [0..13] for 'IV' *AND* 2 low-order bytes [14..15] for 'counter'

memset(state->ivec, 0, 16);

// Copy 'IV' into 14 high-order bytes [0..13] -- 2 low-order bytes [14..15] remain zero

memcpy(state->ivec, iv, 14);

return 0;

}

int pseudorandom_function2()

{

int rc = 0;

AES_KEY aes_key;

struct counter_state state;

unsigned char key[16]; // Master key (16-byte -- 128 bits)

unsigned char iv[14]; // Input vector (14-byte -- 112 bits)

unsigned char x[16]; // 16-byte concatenation of 14-byte Input Vector and 2-byte counter (00)

unsigned char out[16]; // 16-byte encrypted ciphertext

memset(key, 0, sizeof(key));

key[0] = 0xE1;

key[1] = 0xF9;

key[2] = 0x7A;

key[3] = 0x0D;

key[4] = 0x3E;

key[5] = 0x01;

key[6] = 0x8B;

key[7] = 0xE0;

key[8] = 0xD6;

key[9] = 0x4F;

key[10] = 0xA3;

key[11] = 0x2C;

key[12] = 0x06;

key[13] = 0xDE;

key[14] = 0x41;

key[15] = 0x39;

memset(iv, 0, sizeof(iv));

iv[0] = 0x0E;

iv[1] = 0xC6;

iv[2] = 0x75;

iv[3] = 0xAD;

iv[4] = 0x49;

iv[5] = 0x8A;

iv[6] = 0xFE;

iv[7] = 0xEB;

iv[8] = 0xB6;

iv[9] = 0x96;

iv[10] = 0x0B;

iv[11] = 0x3A;

iv[12] = 0xAB;

iv[13] = 0xE6;

memset(x, 0, sizeof(x));

memcpy(x, iv, 14);

// Initialize encryption KEY

rc = AES_set_encrypt_key(key, 128, &aes_key);

if (rc < 0)

{

return -1;

}

reset_state(&state, iv);

memset(out, 0, sizeof(out));

printf("ivec BEFORE: ");

for (int i = 0; i < 16; i++) {

printf("%02x", state.ivec[i]);

}

printf("\n");

// Encrypt given x input using key to out

AES_ctr128_encrypt(x, out, AES_BLOCK_SIZE, &aes_key, state.ivec, state.ecount, &state.num);

for (int k = 0; k < 16; k++)

{

printf("pseudorandom_function2: out[%d] = %02x\n", k, out[k]);

}

printf("ivec AFTER: ");

for (int i = 0; i < 16; i++) {

printf("%02x", state.ivec[i]);

}

printf("\n");

return 0;

}

int main(int argc, char *argv[])

{

pseudorandom_function2();

return 0;

}

实际输出我的屏幕上: ivec BEFORE: 0ec675ad498afeebb6960b3aabe60000

pseudorandom_function2: out[0] = c8

pseudorandom_function2: out[1] = d8

pseudorandom_function2: out[2] = 0f

pseudorandom_function2: out[3] = 3e

pseudorandom_function2: out[4] = 3d

pseudorandom_function2: out[5] = c5

pseudorandom_function2: out[6] = c7

pseudorandom_function2: out[7] = 05

pseudorandom_function2: out[8] = a6

pseudorandom_function2: out[9] = e5

pseudorandom_function2: out[10] = 41

pseudorandom_function2: out[11] = c4

pseudorandom_function2: out[12] = 94

pseudorandom_function2: out[13] = 11

pseudorandom_function2: out[14] = a0

pseudorandom_function2: out[15] = 87

ivec AFTER: 0ec675ad498afeebb6960b3aabe60001

rfcv函数实现_OpenSSL AES_ctr128_encrypt()作为伪随机函数在RFC3711(SRTP)相关推荐

  1. 密码学归约证明——基于伪随机函数的消息鉴别码方案

    1. 消息鉴别码实验 运行得到密钥,即. 敌手获得输入,且能够访问预言机,最终输出,其中为消息的鉴别码.设为敌手访问预言机的问询集合. 当且仅当且,实验输出1.其中是鉴别码方案的验证方法. 如果一个消 ...

  2. 【Joy of Cryptography 读书笔记】Chapter 6 伪随机函数(Pseudorandom Function)分组密码(Block Cipher)

    Chapter 6 伪随机函数(Pseudorandom Function)&分组密码(Block Cipher) 文章目录 Chapter 6 伪随机函数(Pseudorandom Func ...

  3. 伪随机函数 密码学_密码学与理论2:什么是伪随机

    伪随机函数 密码学 正如本系列第一部分所得出的结论,没有随机性的安全性是不可能的. 确定性密码无法抵御强大的攻击者, 真正的随机数生成器不切实际或难以获得,因此加密技术基于伪随机数生成器. 这篇文章的 ...

  4. php是否直接支持函数的重载,php函数重载的替代方法--伪重载详解

    对于弱类型语言来说,PHP函数重载,并不像一般的OOP那样.而弱类型本来就不区分,所以无法通过这些来实现.但是,可以通过下面的方法来实现简单的伪重载吧. 函数重载的替代方法-伪重载,下面看一个具体的实 ...

  5. php 中c函数重载,php函数重载的替代方法--伪重载详解

    php //函数重载的替代方法-伪重载 // //确实,在PHP中没有函数重载这个概念,让很多时候我们无法进行一些处理,甚至有时候不得不在函数后面定义好N个参数 //在看到了func_get_arg, ...

  6. javascript中数组、冒泡排序、函数及函数实参形参、arguments伪数组、异步函数等介绍

    数组: 指一组有顺序的数据,其作用就是用来一次性存储多个数据.(数组元素:数组中的每一个数据:数组长度:数据中元素的个数:数组索引:用来存储或访问数组中的数据,也叫下标,索引从0开始,即第一个数组元素 ...

  7. rfcv函数实现_JAVA_用_JCO连接_SAP,实现调用SAP_的_RFC_函数(整理)(附一篇看起来比较全面的说明)(JCO报错信息)...

    // 获取RFC返回的字段值 11 JCoParameterList exportParam = function.getExportParameterList(); 12 String exPara ...

  8. C语言KDF密钥源代码,区块链中的数学-SM2算法与KDF密钥导出函数

    本节讲了SM2算法的KDF函数,从一般用途到SM2特定实现 ## 写在前面 上一节说了[sm2概述和加密过程](https://learnblockchain.cn/article/1516)实现, ...

  9. oracle分组后伪列,Oracle伪列和伪表和分组函数(row_number,Rank)

    oracle的伪列以及伪表 oracle系统为了实现完整的关系数据库功能,系统专门提供了一组成为伪列(Pseudocolumn)的数据库列,这些列不是在建立对象时由我们完成的,而是在我们建立时由Ora ...

最新文章

  1. pandas编写自定义函数计算多个数据列的加和(sum)、使用groupby函数和apply函数聚合计算分组内多个数据列的加和
  2. Dijkstra的算法
  3. java中wait方法使用实例_java中wait、notify和notifyAll的概念用法和例子?
  4. vue实现一个简单的购物车功能
  5. python---内置模块
  6. 使用百度API实现语音识别——in python
  7. 【Java从0到架构师】Spring - AOP
  8. nova5i有鸿蒙系统吗,华为nova 5i怎么样?值得入手么?
  9. open cv+C++错误及经验总结(二)
  10. 可变换大小的星星c语言源程序,五邑大学试卷_C语言程序设计_信息学院各专业_B卷1教学内容.doc...
  11. Windows Server 2003 SP2 企业版 ISO 下载
  12. 学习数码相框1.2.0.0字符的编码方式_显示点阵文字_freetype_在PC上测试freetype
  13. if函数三个条件怎么用c语言,if函数三个条件怎么用?
  14. 计算机职业规划范文300字,【职业规划300字范文】_职业规划范文300字
  15. 湖南大学计算机与通信学院李燕,基于SVM的面部表情分析
  16. IDEA 反编译失败 提示/*compiled code*/的解决方法
  17. 修改linux系统的时间EDT和EST为CST
  18. 微信网址打开php,微信打开网址添加在浏览器中打开提示
  19. 重装Win7系统后,鼠标和键盘都无法使用
  20. 交互设计实用指南系列(11)—减少记忆负担

热门文章

  1. HTML+CSS+JS实现 ❤️canvas酷炫表白爱心动画❤️
  2. java 取dataset_Java LineDataSet.getYVals方法代码示例
  3. java定义一个方法,返回一个浮点数保留两位小数,考虑四舍五入的结果
  4. C++ 输出单个字符
  5. c语言未声明的标识符什么意思_C语言中%d和%f是什么意思啊?
  6. 线性规划 —— matlab
  7. 数学建模学习笔记(三)——插值算法
  8. access求斐波拉契数列_打印目录,斐波那契数列的递归与循环,牧场牛数
  9. mac 删除分区 command r 选择网络_Mac使用必看基础篇,Mac快捷键大全,mac新手入门指南...
  10. ef power tools mysql_使用 EF Power Tool Code Frist 生成 Mysql 实体