精华内容
下载资源
问答
  • 根据 https://bbs.125.la/forum.php?mod=viewthreadtid=14033539  此贴源码修改的 ps:特别感谢 不常见的还有 CFB1 等等,遇到了就做个,毕竟可以混个首发
  • 以山西昱光电厂不同机组的CFB粉煤灰为研究对象,根据CFB锅炉热工制度及脱硫工艺的不同,将CFB粉煤灰分为高温高钙型(F1)、低温低钙型(F2)和低温高钙型(XF2)。通过X射线衍射、需水性、活性和减水剂的相容性试验,对比分析...
  • CFB

    2019-10-24 03:42:55
    CFB
  • CFB锅炉由于其效率高、污染低、煤种适应性好,是一种环保节能型锅炉,是目前环保节能型电厂的发展方向,在国际上已进入大型化、商品化生产阶段。国内也陆续投产了一大批循环流化床煤矸石发电厂,由于CFB锅炉燃烧应用技术...
  • 为了研究CFB锅炉外置换热器的启动过程特性,以便为CFB宽负荷运行和灵活性调峰提供依据,在已有的CFB锅炉系统机理动态数学模型的基础上,详细建立了外置换热器动态模型,并以某660 MW超超临界CFB锅炉为对象,模拟分析...
  • 完整能运行的java AES源代码,需要官网手工下载local_policy.jar 和 US_export_policy.jar文件覆盖java安装目录的文件,才能使用CFB模式。下载地址为: ... //java -jar testAES.jar --generate-key ./key.txt 256 ...
  • 产品型号:MC68HC908GP32CFB工作电压(V):3.0, 5.0Flash(字节):32KRAM(字节):512EEPROM(字节):-定时器:4×16bit IC,OC,或PWMI/O:33串行通讯:SCI,SPIA/D:8×8bitPWM:4×16bitCOP:Y最大总线频率(MHz):8附加资料:PLL,可...
  • 在柔性循环流化床(CFB)锅炉中结合,开发和演示高比例的可持续生物质与煤的氧燃烧,将在减少温室气体(GHG)排放方面带来重大进展。 涉及的领域包括:生物质表征; 处理和喂养; 共燃比定义; CFB氧共燃烧研究; ...
  • 文章论述了660MW常规超超临界、高效超超临界及二次再热CFB锅炉技术的方案,对3种方案的可行性进行了阐述;分析了超超临界CFB机组超低排放的技术方案可行性,形成了超低排放技术研究的总体思路和目标。即在实现超超临界...
  • mcidle-python Minecraft的空闲cli,它将您的连接传送到Minecraft服务器,从而使您可以随时断开连接,但仍通过mcidle连接到服务器。 对于惩罚您断开连接的服务器(例如,具有队列的2b2t.org )尤其有用。...
  • IEEE 802.11 DCF作为无线局域网介质访问层基本协议未考虑优先级,而IEEE 802.11e EDCA协议在数据竞争接入信道时引入了优先级的概念,不同级别的业务流可采用不同的信道接人参数.EDCA机制允许采用CFB(竞争空闲突发...
  • 结合神华准能矸电一期2×150MWCFB机组多年的运行实践,针对降低机组供电煤耗...找出了造成供电煤耗高的各方面原因,并提出建议和解决方法,为CFB机组进一步节约燃煤,提高机组热经济性,降低供电煤耗提供借鉴和操作指导。
  • R CFB数据刮板 该存储库的内容来自在的最初工作。 文献资料
  • 为了提高CFB锅炉脱硫效率,以宁夏国华宁东发电有限公司330MW CFB锅炉炉内脱硫系统为试验对象进行了研究。发现影响脱硫效率的主要因素有CFB锅炉运行床温、上下二次风配比、床压、石灰石粒度、石灰石品质等。通过优化...
  • des ecb cbc CFB OFB

    2017-03-29 15:20:52
    des ecb cbc CFB OFB
  • 华通机电CFB30(DZ30)-32系列小型断路器pdf,华通机电CFB30-32小型断路器适用于交流50Hz、额定电压230V,额定电流至32A线路中作过载和短路保护之用,也可以在正常情况下作为线路的不频繁操作转换之用。该断路器是2极...
  • 华通机电CFB1-63系列小型断路器pdf,华通机电CFB1-63系列小型断路器(以下简称断路器),适用于交流50Hz或60Hz,额定工作电压至400V,额定电流至400V,额定电流至63A的电路中,作为线路、照明及动力设备的过载和短路...
  • 华通机电CFB30LE(DZ30LE)-32系列漏电断路器pdf,华通机电CFB30LE-32漏电断路器适用于交流50/60Hz额定电压不超过400V、额定电流至32A的线路中,当人身触电或电网泄漏电流超过规定值时,剩余电流动作断路器能在极短的...
  • 包含内容:SM4国密加密算法C语言实现 ...1.电码本模式(Electronic Codebook Book (ECB)); ... 3.计算器模式(Counter (CTR)); 4.密码反馈模式(Cipher FeedBack (CFB)); 5.输出反馈模式(Output FeedBack (OFB))
  • NIST标准,AES加密模式介绍包括(ECB,CBC,CFB,OFB,CTR)。This recommendation defines five confidentiality modes of operation for use with an underlying symmetric key block cipher algorithm: Electronic ...
  • 1、完整的AES(ECB、CBC、CFB、CTR)算法,C语言实现,可用于金融POS安全认证; 2、AES-128、AES-192、AES-256加密/解密 3、内含测试程序,在Linux环境下进入目录后make即可编译,已经在ubuntu16.04环境下编译测试OK;
  • CFB 锅炉炉内的物料平衡可以影响CFB 锅炉安全稳定高效运行,研究炉内的物料平衡有助于指导实际锅炉的运行。根据清华大学提出的成灰磨耗实验方法,获得了660 MW 超超临界CFB 锅炉燃用的3 种煤种的本征成灰特性数据。对...
  • 大型CFB燃烧试验台实炉运行操作安全教育 及试验台参观
  • DES及其3种改进版CBC,CFB,OFB加密模式编程实现,DES采用java提供的加密类Cipher实现。CBC,CFB,OFB给予自己写的DES类实现,有加密过程,可参考学习密码学。
  • 实战篇-OpenSSL之AES加密算法-CFB1模式一、AES简介二、CFB1模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB1模式加解密(3)测试代码 一、AES简介 密码学中的高级加密标准(Advanced Encryption ...

    本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

    一、AES简介

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

    这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
    PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    AES属于对称加密算法,加解密使用同一个秘钥。

    对称加密算法,一般有至少4种模式,即ECB、CBC、CFB、OFB等。

    具体的加密原理,就不进行介绍了,本文主要从使用角度,进行说明。

    以下命令行和编程实现,均基于OpenSSL开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

    二、CFB1模式

    加密反馈模式 Cipher Feedback Mode(CFB)。面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下, 数据用更小的单元加密,如可以是8 位,这个长度小于定义的块长(通常是64 位)。

    1、命令行操作

    使用aes-128-cfb1对hello.txt加密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,密文为hello.en。

    openssl enc -e -aes-128-cfb1 -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    使用aes-128-cfb1对hello.en解密,密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,解密后的文件为hello.de。

    openssl enc -d -aes-128-cfb1 -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    2、函数说明

    AES CFB1加密/解密:

    void AES_cfb1_encrypt(const unsigned char *in, unsigned char *out,
                          size_t length, const AES_KEY *key,
                          unsigned char *ivec, int *num, const int enc);
    
    参数名称含义
    in输入数据,长度任意
    out输出数据,长度与输入数据相等
    length输入数据的位数,即输入数据长度*8
    key使用AES_set_encrypt_key生成的Key
    ivec可读写的一块内存。长度必须是16字节。
    num应总是为0,否则会触发断言
    encAES_ENCRYPT 代表加密, AES_DECRYPT代表解密

    AES_cfb1_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

    3、编程实现

    (1)特别注意

    • CFB模式加密和解密均使用加密key,这一点比较反常,务必记住。
    • CFB模式不需要对输入数据进行填充。
    • AES_cfb1_encrypt函数length参数,为输入数据的位数,即输入数据长度*8,而不是字节数。

    (2)实现CFB1模式加解密

    下面,函数已经封装完毕,如下:

    /**
     * @brief AES::cfb1_encrypt
     * CFB1模式加解密,支持对任意长度明文进行加解密。
     * @param in 输入数据
     * @param out 输出结果
     * @param key 密钥,长度必须是16/24/32字节,否则加密失败
     * @param ivec 初始向量,长度必须是16字节
     * @param enc true-加密,false-解密
     * @return 执行结果
     */
    bool AES::cfb1_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
    {
        // 检查密钥合法性(只能是16、24、32字节)
        Q_ASSERT(key.size() == 16 || key.size() == 24 || key.size() == 32);
        Q_ASSERT(ivec.size() == 16); // 初始向量为16字节
    
        // 特别注意:CFB模式加密和解密均使用加密key。
        // 生成加密key
        AES_KEY aes_key;
        if (AES_set_encrypt_key((const unsigned char*)key.data(), key.size() * 8, &aes_key) != 0)
        {
            return false;
        }
    
        // 执行CFB1模式加密或解密
        int num = 0;
        QByteArray ivecTemp = ivec; // ivec会被修改,故需要临时变量来暂存
        int encVal = enc ? AES_ENCRYPT : AES_DECRYPT;
        out.resize(in.size()); // 调整输出buf大小
        AES_cfb1_encrypt((const unsigned char*)in.data(),
                        (unsigned char*)out.data(),
                        in.size() * 8,
                        &aes_key,
                        (unsigned char*)ivecTemp.data(),
                        &num,
                        encVal);
        return true;
    }
    

    加密过程:

    • 生成加密key
    • 执行加密

    解密过程:

    • 生成加密key
    • 执行解密

    经测试,本函数支持对任意长度输入数据进行加解密。

    (3)测试代码

    void createTestData(QByteArray& data, int size)
    {
        data.resize(size);
        for (int i = 0; i < size; i++)
        {
            data[i] = i % 128;
        }
    }
    
    void testAES(const QByteArray& data)
    {
        QByteArray plainText = data;
        QByteArray encryptText;
        QByteArray decryptText;
    
        QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad");
        QByteArray ivec = QByteArray::fromHex("667b02a85c61c786def4521b060265e8");
    
        // AES cfb1模式加密验证
        AES aes;
        aes.cfb1_encrypt(plainText, encryptText, key, ivec, true);    // 加密
        aes.cfb1_encrypt(encryptText, decryptText, key, ivec, false); // 解密
        qDebug() << "AES cfb1 encrypt verify" << ((decryptText == plainText) ? "succeeded" : "failed");
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍
        QByteArray data;
        createTestData(data, 1*1024*1024+3);
    
        // 测试AES
        testAES(data);     // 测试,直接调用OpenSSL中AES算法函数
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    本文涉及工程代码地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    在这里插入图片描述

    展开全文
  • 针对云宁矸石热电有限公司锅炉尾部烟道省煤器产生的磨损、漏水、堵灰、排烟温度偏高的实际情况,应用螺旋鳍片管省煤器对高温段锅炉省煤器进行改造,消除锅炉省煤器缺陷,降低锅炉排烟温度,减少排烟热损失,提高锅炉效率,...
  • 实战篇-OpenSSL之AES加密算法-CFB8模式一、AES简介二、CFB8模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB8模式加解密(3)测试代码 一、AES简介 密码学中的高级加密标准(Advanced Encryption ...

    本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

    一、AES简介

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

    这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
    PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    AES属于对称加密算法,加解密使用同一个秘钥。

    对称加密算法,一般有至少4种模式,即ECB、CBC、CFB、OFB等。

    具体的加密原理,就不进行介绍了,本文主要从使用角度,进行说明。

    以下命令行和编程实现,均基于OpenSSL开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

    二、CFB8模式

    加密反馈模式 Cipher Feedback Mode(CFB)。面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下, 数据用更小的单元加密,如可以是8 位,这个长度小于定义的块长(通常是64 位)。

    1、命令行操作

    使用aes-128-cfb8对hello.txt加密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,密文为hello.en。

    openssl enc -e -aes-128-cfb8 -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    使用aes-128-cfb8对hello.en解密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,解密后的文件为hello.de。

    openssl enc -d -aes-128-cfb8 -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    2、函数说明

    AES CFB8加密/解密:

    void AES_cfb8_encrypt(const unsigned char *in, unsigned char *out,
                          size_t length, const AES_KEY *key,
                          unsigned char *ivec, int *num, const int enc);
    
    参数名称含义
    in输入数据,长度任意
    out输出数据,长度与输入数据相等
    length输入数据的长度,字节数
    key使用AES_set_encrypt_key生成的Key
    ivec可读写的一块内存。长度必须是16字节。
    num应总是为0,否则会触发断言
    encAES_ENCRYPT 代表加密, AES_DECRYPT代表解密

    AES_cfb8_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

    3、编程实现

    (1)特别注意

    • CFB模式加密和解密均使用加密key,这一点比较反常,务必记住。
    • CFB模式不需要对输入数据进行填充。
    • AES_cfb8_encrypt函数length参数,为输入数据长度,字节数。这一点与CFB1模式中有所不同。

    (2)实现CFB8模式加解密

    下面,函数已经封装完毕,如下:

    /**
     * @brief AES::cfb8_encrypt
     * CFB8模式加解密,支持对任意长度明文进行加解密。
     * @param in 输入数据
     * @param out 输出结果
     * @param key 密钥,长度必须是16/24/32字节,否则加密失败
     * @param ivec 初始向量,长度必须是16字节
     * @param enc true-加密,false-解密
     * @return 执行结果
     */
    bool AES::cfb8_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
    {
        // 检查密钥合法性(只能是16、24、32字节)
        Q_ASSERT(key.size() == 16 || key.size() == 24 || key.size() == 32);
        Q_ASSERT(ivec.size() == 16); // 初始向量为16字节
    
        // 特别注意:CFB模式加密和解密均使用加密key。
        // 生成加密key
        AES_KEY aes_key;
        if (AES_set_encrypt_key((const unsigned char*)key.data(), key.size() * 8, &aes_key) != 0)
        {
            return false;
        }
    
        // 执行CFB8模式加密或解密
        int num = 0;
        QByteArray ivecTemp = ivec; // ivec会被修改,故需要临时变量来暂存
        int encVal = enc ? AES_ENCRYPT : AES_DECRYPT;
        out.resize(in.size()); // 调整输出buf大小
        AES_cfb8_encrypt((const unsigned char*)in.data(),
                        (unsigned char*)out.data(),
                        in.size(),
                        &aes_key,
                        (unsigned char*)ivecTemp.data(),
                        &num,
                        encVal);
        return true;
    }
    

    加密过程:

    • 生成加密key
    • 执行加密

    解密过程:

    • 生成加密key
    • 执行解密

    经测试,本函数支持对任意长度输入数据进行加解密。

    (3)测试代码

    void createTestData(QByteArray& data, int size)
    {
        data.resize(size);
        for (int i = 0; i < size; i++)
        {
            data[i] = i % 128;
        }
    }
    
    void testAES(const QByteArray& data)
    {
        QByteArray plainText = data;
        QByteArray encryptText;
        QByteArray decryptText;
    
        QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad");
        QByteArray ivec = QByteArray::fromHex("667b02a85c61c786def4521b060265e8");
    
        // AES cfb8模式加密验证
        AES aes;
        aes.cfb8_encrypt(plainText, encryptText, key, ivec, true);     // 加密
        aes.cfb8_encrypt(encryptText, decryptText, key, ivec, false);  // 解密
        qDebug() << "AES cfb8 encrypt verify" << ((decryptText == plainText) ? "succeeded" : "failed");
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍
        QByteArray data;
        createTestData(data, 1*1024*1024+3);
    
        // 测试AES
        testAES(data);     // 测试,直接调用OpenSSL中AES算法函数
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    本文涉及工程代码地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    在这里插入图片描述

    展开全文
  • 实战篇-OpenSSL之TripleDES加密算法-CFB64模式一、TripleDES简介二、CFB64模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB64模式加解密(3)测试代码 一、TripleDES简介 3DES又称Triple DES,是...

    本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

    一、TripleDES简介

    3DES又称Triple DES,是DES加密算法的一种模式,它使用2条不同的56位的密钥对数据进行三次加密。

    数据加密标准(DES)是美国的一种由来已久的加密标准,它使用对称密钥加密法,并于1981年被ANSI组织规范为ANSI X.3.92。

    DES使用56位密钥和密码块的方法,而在密码块的方法中,文本被分成64位大小的文本块然后再进行加密。比起最初的DES,3DES更为安全。

    3DES(即Triple DES)是DES向AES过渡的加密算法,它使用3条56位的密钥对数据进行三次加密。是DES的一个更安全的变形。
    它以DES为基本模块,通过组合分组方法设计出分组加密算法。比起最初的DES,3DES更为安全。

    Triple DES属于对称加密算法,加解密使用同一个秘钥。

    对称加密算法,一般有至少4种模式,即ECB、CBC、CFB、OFB等。

    具体的加密原理,就不进行介绍了,本文主要从使用角度,进行说明。

    以下命令行和编程实现,均基于OpenSSL开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

    二、CFB64模式

    加密反馈模式 Cipher Feedback Mode(CFB)。面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下, 数据用更小的单元加密,如可以是8 位,这个长度小于定义的块长(通常是64 位)。

    1、命令行操作

    使用des-ede3-cfb对hello.txt加密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,初始化向量为667b02a85c61c786,密文为hello.en。

    openssl enc -e -des-ede3-cfb -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46 -iv 667b02a85c61c786
    

    使用des-ede3-cfb对hello.en解密,密钥为8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46,初始化向量为667b02a85c61c786,解密后的文件为hello.de。

    openssl enc -d -des-ede3-cfb -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46 -iv 667b02a85c61c786
    

    2、函数说明

    CFB64模式加密/解密:

    void DES_ede3_cfb64_encrypt(const unsigned char *in, unsigned char *out,
                                long length, DES_key_schedule *ks1,
                                DES_key_schedule *ks2, DES_key_schedule *ks3,
                                DES_cblock *ivec, int *num, int enc);
    
    参数名称含义
    in输入数据,长度任意
    out输出数据,长度与输入数据相等。
    length输入数据的实际长度。
    ks1使用DES_set_key_unchecked生成的Key
    ks2使用DES_set_key_unchecked生成的Key
    ks3使用DES_set_key_unchecked生成的Key
    ivec可读写的一块内存。长度必须是8字节。
    encDES_ENCRYPT代表加密, DES_DECRYPT代表解密

    DES_ede3_cfb64_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

    3、编程实现

    (1)特别注意

    • CFB模式不需要对输入数据进行填充。

    (2)实现CFB64模式加解密

    下面,函数已经封装完毕,如下:

    /**
     * @brief TripleDES::cfb64_encrypt
     * CFB64模式加解密,支持对任意长度明文进行加解密。
     * @param in 输入数据
     * @param out 输出结果
     * @param key 密钥,长度必须是24字节,否则加密失败
     * @param ivec 初始向量,长度必须是8字节
     * @param enc true-加密,false-解密
     */
    void TripleDES::cfb64_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
    {
        // 检查密钥合法性(只能是24字节)
        Q_ASSERT(key.size() == 24);
        Q_ASSERT(ivec.size() == 8); // 初始向量为8字节
    
        // 设置key
        DES_key_schedule sch1, sch2, sch3;
        setKey(key, sch1, sch2, sch3);
    
        // 进行加解密
        int num = 0;
        QByteArray ivecTemp = ivec; // 此参数被自动修改,故使用局部变量传递
        int encVal = enc ? DES_ENCRYPT : DES_DECRYPT;
        out.resize(in.size()); // 调整输出buf大小
        DES_ede3_cfb64_encrypt((const unsigned char *)in.constData(),
                             (unsigned char *)out.data(),
                             in.size(), &sch1, &sch2, &sch3,
                             (DES_cblock *)ivecTemp.data(), &num, encVal);
    }
    

    加解密过程:

    • 生成key
    • 执行加解密

    经测试,本函数支持对任意长度输入数据进行加解密。

    (3)测试代码

    void createTestData(QByteArray& data, int size)
    {
        data.resize(size);
        for (int i = 0; i < size; i++)
        {
            data[i] = i % 128;
        }
    }
    
    void testTripleDES(const QByteArray& data)
    {
        QByteArray plainText = data;
        QByteArray encryptText;
        QByteArray decryptText;
    
        QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad8cc72b05705d5c46");
        QByteArray ivec = QByteArray::fromHex("667b02a85c61c786");
    
        // TripleDES cfb64模式加密验证
        TripleDES tripleDES;
        tripleDES.cfb64_encrypt(plainText, encryptText, key, ivec, true);    // 加密
        tripleDES.cfb64_encrypt(encryptText, decryptText, key, ivec, false); // 解密
        qDebug() << "TripleDES cfb64 encrypt verify" << ((decryptText == plainText) ? "succeeded" : "failed");
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍
        QByteArray data;
        createTestData(data, 1*1024*1024+3);
    
        // 测试TripleDES
        testTripleDES(data);
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    本文涉及工程代码地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    在这里插入图片描述

    展开全文
  • 实战篇-OpenSSL之AES加密算法-CFB128模式一、AES简介二、CFB128模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB128模式加解密(3)测试代码 一、AES简介 密码学中的高级加密标准(Advanced ...

    本文属于《OpenSSL加密算法库使用系列教程》之一,欢迎查看其它文章。

    一、AES简介

    密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法,是美国联邦政府采用的一种区块加密标准。

    这个标准用来替代原先的DES,已经被多方分析且广为全世界所使用。经过五年的甄选流程,高级加密标准由美国国家标准与技术研究院(NIST)于2001年11月26日发布于FIPS
    PUB 197,并在2002年5月26日成为有效的标准。2006年,高级加密标准已然成为对称密钥加密中最流行的算法之一。

    AES属于对称加密算法,加解密使用同一个秘钥。

    对称加密算法,一般有至少4种模式,即ECB、CBC、CFB、OFB等。

    具体的加密原理,就不进行介绍了,本文主要从使用角度,进行说明。

    以下命令行和编程实现,均基于OpenSSL开源库。在命令行中,我们可以使用命令实现对文件加解密,以验证我们的编程实现,是否正确。

    二、CFB128模式

    加密反馈模式 Cipher Feedback Mode(CFB)。面向字符的应用程序的加密要使用流加密法,可以使用加密反馈模式。在此模式下, 数据用更小的单元加密,如可以是8 位,这个长度小于定义的块长(通常是64 位)。

    1、命令行操作

    使用aes-128-cfb对hello.txt加密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,密文为hello.en。

    openssl enc -e -aes-128-cfb -in hello.txt -out hello.en -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    使用aes-128-cfb对hello.en解密,128位密钥为8cc72b05705d5c46f412af8cbed55aad,初始化向量为667b02a85c61c786def4521b060265e8,解密后的文件为hello.de。

    openssl enc -d -aes-128-cfb -in hello.en -out hello.de -K 8cc72b05705d5c46f412af8cbed55aad -iv 667b02a85c61c786def4521b060265e8
    

    2、函数说明

    AES CFB128加密/解密:

    void AES_cfb128_encrypt(const unsigned char *in, unsigned char *out,
                            size_t length, const AES_KEY *key,
                            unsigned char *ivec, int *num, const int enc);
    
    参数名称含义
    in输入数据,长度任意
    out输出数据,长度与输入数据相等
    length输入数据的长度,字节数
    key使用AES_set_encrypt_key生成的Key
    ivec可读写的一块内存。长度必须是16字节。
    num应总是为0,否则会触发断言
    encAES_ENCRYPT 代表加密, AES_DECRYPT代表解密

    AES_cfb128_encrypt在加密的过程中会修改ivec的内容,因此ivec参数不能是一个常量,而且不能在传递给加密函数后再立马传递给解密函数,必须重新赋值之后再传递给解密函数。

    3、编程实现

    (1)特别注意

    • CFB模式加密和解密均使用加密key,这一点比较反常,务必记住。
    • CFB模式不需要对输入数据进行填充。
    • AES_cfb128_encrypt函数length参数,为输入数据长度,字节数。这一点与CFB1模式中有所不同。

    (2)实现CFB128模式加解密

    下面,函数已经封装完毕,如下:

    /**
     * @brief AES::cfb128_encrypt
     * CFB128模式加解密,支持对任意长度明文进行加解密。
     * @param in 输入数据
     * @param out 输出结果
     * @param key 密钥,长度必须是16/24/32字节,否则加密失败
     * @param ivec 初始向量,长度必须是16字节
     * @param enc true-加密,false-解密
     * @return 执行结果
     */
    bool AES::cfb128_encrypt(const QByteArray &in, QByteArray &out, const QByteArray &key, const QByteArray &ivec, bool enc)
    {
        // 检查密钥合法性(只能是16、24、32字节)
        Q_ASSERT(key.size() == 16 || key.size() == 24 || key.size() == 32);
        Q_ASSERT(ivec.size() == 16); // 初始向量为16字节
    
        // 特别注意:CFB模式加密和解密均使用加密key。
        // 生成加密key
        AES_KEY aes_key;
        if (AES_set_encrypt_key((const unsigned char*)key.data(), key.size() * 8, &aes_key) != 0)
        {
            return false;
        }
    
        // 执行CFB128模式加密或解密
        int num = 0;
        QByteArray ivecTemp = ivec; // ivec会被修改,故需要临时变量来暂存
        int encVal = enc ? AES_ENCRYPT : AES_DECRYPT;
        out.resize(in.size()); // 调整输出buf大小
        AES_cfb128_encrypt((const unsigned char*)in.data(),
                        (unsigned char*)out.data(),
                        in.size(),
                        &aes_key,
                        (unsigned char*)ivecTemp.data(),
                        &num,
                        encVal);
        return true;
    }
    

    加密过程:

    • 生成加密key
    • 执行加密

    解密过程:

    • 生成加密key
    • 执行解密

    经测试,本函数支持对任意长度输入数据进行加解密。

    (3)测试代码

    void createTestData(QByteArray& data, int size)
    {
        data.resize(size);
        for (int i = 0; i < size; i++)
        {
            data[i] = i % 128;
        }
    }
    
    void testAES(const QByteArray& data)
    {
        QByteArray plainText = data;
        QByteArray encryptText;
        QByteArray decryptText;
    
        QByteArray key = QByteArray::fromHex("8cc72b05705d5c46f412af8cbed55aad");
        QByteArray ivec = QByteArray::fromHex("667b02a85c61c786def4521b060265e8");
    
        // AES cfb128模式加密验证
        AES aes;
        aes.cfb128_encrypt(plainText, encryptText, key, ivec, true);     // 加密
        aes.cfb128_encrypt(encryptText, decryptText, key, ivec, false);  // 解密
        qDebug() << "AES cfb128 encrypt verify" << ((decryptText == plainText) ? "succeeded" : "failed");
    }
    
    int main(int argc, char *argv[])
    {
        QCoreApplication a(argc, argv);
    
        // 产生1MB+3B的测试数据,为了使该测试数据长度,不为8或16的整数倍
        QByteArray data;
        createTestData(data, 1*1024*1024+3);
    
        // 测试AES
        testAES(data);     // 测试,直接调用OpenSSL中AES算法函数
    
        return a.exec();
    }
    

    执行结果:

    在这里插入图片描述

    本文涉及工程代码地址:https://gitee.com/bailiyang/cdemo/tree/master/Qt/49OpenSSL/OpenSSL



    若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!

    同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。

    在这里插入图片描述

    展开全文
  • 由于我国CFB发电技术大型化发展进程慢,小容量CFB机组占比大,现役CFB机组总体能耗及污染物排放浓度高,不能满足国家最新的节能减排政策。新形势下,神华国能集团牵头承担国家重点研发计划课题—超超临界CFB锅炉技术研发...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,311
精华内容 9,324
关键字:

cfb

友情链接: wenzitext.rar