精华内容
下载资源
问答
  • 完整能运行的java AES源代码,需要官网手工下载local_policy.jar 和 US_export_policy.jar文件覆盖java安装目录的文件,才能使用CFB模式。下载地址为: ... //java -jar testAES.jar --generate-key ./key.txt 256 ...
  • CFB加解密模式

    千次阅读 2019-10-12 14:45:09
    CFB模式中,前一个密文分组会被送回到密码算法的输入端。...我们将CBC模式和CFB模式对比一下,就可以看出其中的差异了,在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组...

    在CFB模式中,前一个密文分组会被送回到密码算法的输入端。所谓反馈,这里指的就是返回输入端的意思,如下图所示:

    技术分享

    在ECB模式和CBC模式中,明文分组都是通过密码算法就行加密的,而在CFB模式中,明文分组并没有通过密码算法来直接进行加密。

    我们将CBC模式和CFB模式对比一下,就可以看出其中的差异了,在CBC模式中,明文分组和密文分组之间有XOR和密码算法两个步骤,而在CFB模式中,明文分组和密文分组之间只有XOR。

    技术分享

     

    CFB模式的优点:

    1. 隐藏了明文模式
    2. 分组密码转化为流模式
    3. 可以及时加密传送小于分组的数据

     

    CFB模式的缺点:

    1. 不利于并行计算
    2. 误差传送:一个明文单元损坏影响多个单元
    3. 唯一的IV

     

    对CFB模式的攻击,截图来源自图解密码技术一书:

    技术分享

    技术分享

     

    CFB模式的加密:

    #include <STRING.H>
    
    #define IN
    #define OUT
    
    //假设加密分组为4字节一组
    
    void Encrypt(IN char *lpszData, IN char *lpszKey, OUT char *lpszEnData)
    {
        int i = 0;
        for (i = 0; i < 4; i++)
        {
            lpszEnData[i] = lpszData[i] ^ lpszKey[i];
        }
    }
    
    void Decrypt(IN char *lpszData, IN char *lpszKey, OUT char *lpszDeData)
    {
        int i = 0;
        for (i = 0; i < 4; i++)
        {
            lpszDeData[i] = lpszData[i] ^ lpszKey[i];
        }
    }
    
    int main(int argc, char* argv[])
    {
        char szData[] = "Hello World!";
        char szEnData[16] = {0};
        char szDeData[16] = {0};
        char *lpszKey = "1234";
        int i = 0;
        char szIV[] = "9999";
    
        printf("原始数据: %s\r\n", szData);
        
        while (true)
        {
            if (strlen(szData + i) == 0)
            {
                break;
            }
    
            //与前一个密文分组加密
            Encrypt(szIV, lpszKey, szIV);
    
            //与明文分组xor操作
            //由于自己的加密也是异或, 所以就不单独写与密文分组的xor函数了
            Encrypt(szData + i, szIV, szIV);
            memcpy(szEnData + i, szIV, 4);
            i += 4;
        }
    
        printf("加密后数据: %s\r\n", szEnData);
    
        memcpy(szIV, "9999", 4);
    
        i = 0;
        char szPreEnData[8] = {0};
    
        while (true)
        {
            if (strlen(szEnData + i) == 0)
            {
                break;
            }
    
            memcpy(szPreEnData, szEnData + i, 4);
            //与前一个密文分组加密, 注意这里是加密, 而不是解密!!!!!!!!!!!!!!
            Encrypt(szIV, lpszKey, szIV);
    
            //与密文分组xor操作得到明文
            //由于自己的加密也是异或, 所以就不单独写与密文分组的xor函数了
            Encrypt(szEnData + i, szIV, szDeData + i);
            memcpy(szIV, szPreEnData, 4);
    
            i += 4;
        }
    
        printf("解密后数据: %s\r\n", szDeData);
    
        return 0;
    }

    原始数据: Hello World!
    加密后数据: @nfa|:]"U/
    解密后数据: Hello World!

    展开全文
  • DES及其3种改进版CBC,CFB,OFB加密模式编程实现,DES采用java提供的加密类Cipher实现。CBC,CFB,OFB给予自己写的DES类实现,有加密过程,可参考学习密码学。
  • 其中,CFB 操作模式为 8 位 CFB 操作模式,OFB 操作模式为 8 位 OFB 操作模 式。2. 要求以命令行的形式,指定明文文件、密钥文件、初始化向量文件的位置和名称、加密的操作模式以 及加密完成后密文文件的位置和名称...

    项目描述

    1. 分别实现 ECB、CBC、CFB、OFB 这四种操作模式的 DES。每种操作模式都有一组对应的测试数据, 以便检查程序的正确性。其中,CFB 操作模式为 8 位 CFB 操作模式,OFB 操作模式为 8 位 OFB 操作模 式。

    2. 要求以命令行的形式,指定明文文件、密钥文件、初始化向量文件的位置和名称、加密的操作模式以 及加密完成后密文文件的位置和名称。加密时先分别从指定的明文文件、密钥文件和初始化向量文件中 读取有关信息,然后按指定的操作模式进行加密,最后将密文(用 16 进制表示)写入指定的密文文件。

    命令行的具体格式如下:  e1des -p plainfile -k keyfile [-v vifile] -m mode -c cipherfile  参数:  -p plainfile 指定明文文件的位置和名称 -k keyfile  指定密钥文件的位置和名称 -v vifile  指定初始化向量文件的位置和名称 -m mode  指定加密的操作模式 -c cipherfile 指定密文文件的位置和名称。

    3. 分别实现对每种操作模式下加密及解密速度的测试,要求在程序中生成 5MB 的随机测试数据(不要 求使用随机数发生器),连续加密、解密 20 次,记录并报告每种模式的加密和解密的总时间(毫秒)和 速度(MByte/秒)。

    4. 用 C 和/或 C++语言完成程序。

    运行环境

    vs2012

    项目技术(必填)

    DES C++

    展开全文
  • @implementation NSData (EHIExtension) /** AES解密:CFB模式 */ - (NSData *)aes256ByCFBModeWithOperation:(CCOperation)operation key:(NSString *)keyStr iv:(NSString *)ivStr { NSData *originData = self;...

    前言

    首先,希望大家耐心点,这个加密我也是弄很久才出来的,辛辛苦苦整理的博客,介绍大概概念就进入正题!

    上面是基本介绍,后面是个人经历的问题及解决方案,希望你们耐心看,不要踩我进过的坑啦!祝你们都能顺利解决问题✌️

    1. 介绍

    1.1 AES是什么?

    分组密码算法,旨在取代 DES 成为广泛使用的标准。

    1.2 AES详解

    AES 根据使用密码长度有三种方案以应对不同的场景要求,分别是 AES-128、AES-192 和 AES-256。加密模式有四种,分别是 ECB(Elecyronic Code Book,电子密码本)、CBC(Cipher Block Chaining,加密块链)、CFB(Cipher FeedBack Mode,加密反馈)、OFB(Output FeedBack,输出反馈)。

    需要和后台统一四个东西:秘钥长度、加密模式、填充方式、初始向量(也称偏移量,ECB模式不需要)。

    定义中说到 AES 是一个对称分组密码算法,加密原理如图:

    AES 加密原理

    1.3 实现原理和比较

    这个就比较深入啦,有兴趣的自行查看~

    实现原理

    比较

    1.4 模式和填充选择

    算法/模式/填充

    16字节加密后数据长度

    不满16字节加密后长度

    AES/CBC/NoPadding

    16

    不支持

    AES/CBC/PKCS5Padding

    32

    16

    AES/CBC/ISO10126Padding

    32

    16

    AES/CFB/NoPadding

    16

    原始数据长度

    AES/CFB/PKCS5Padding

    32

    16

    AES/CFB/ISO10126Padding

    32

    16

    AES/ECB/NoPadding

    16

    不支持

    AES/ECB/PKCS5Padding

    32

    16

    AES/ECB/ISO10126Padding

    32

    16

    AES/OFB/NoPadding

    16

    原始数据长度

    AES/OFB/PKCS5Padding

    32

    16

    AES/OFB/ISO10126Padding

    32

    16

    AES/PCBC/NoPadding

    16

    不支持

    AES/PCBC/PKCS5Padding

    32

    16

    AES/PCBC/ISO10126Padding

    32

    16

    PKCS7Padding VS PKCS5Padding:

    PKCS5Padding 的 blocksize 为8字节,而 PKCS7Padding 的 blocksize 可以为1到255字节。

    需要注意点:

    1. iOS只支持 PKCS7Padding 填充方式;Java 支持 PKCS5Padding 但不支持 PKCS7Padding,不过不要担心,上面说的区别我也不懂,实际中倒是一样;

    2. node.js 在 AES 加密上和其他语言有略不同,它系统自带方法对 Key 进行过 MD5 处理。

    2. 经验总结

    2.1 加密模式和填充方式的确定

    首先,一定要确认使用的加密模式和填充方式!!!因为我接到任务的时候邮件里只给了 key 和 iv,没有说清楚,而 iOS 默认的是 CBC 模式,Android 是 CFB 模式一下就 OK 了,我调了半天不行,看了 Android 的代码才醒悟过来。。。。。。

    我的项目中,后台使用的是AES/CFB/PKCS7Padding,Android 使用的是AES/CFB/PKCS5Padding。

    2.2 填充方式的选择

    其次,填充方式的选择:按照上面来看,我使用 AES/CFB/PKCS7Padding 就可以了哈。

    然而,iOS 有的加密方法,只有 CCCryptorCreateWithMode 可以设置除了默认的 CBC 、ECB 之外的其他模式,所以就用它啦,其方法如下:

    CCCryptorStatus status = CCCryptorCreateWithMode(operation,

    kCCModeCFB,

    kCCAlgorithmAES,

    ccPKCS7Padding,

    iv,

    key,

    keyStr.length,

    NULL,

    0,

    0,

    0,

    &cryptor);

    这里的 padding 除了 ccPKCS7Padding,还有 ccNoPadding 不填充两种选择。我试了两个的加密结果是一样的,使用 ccPKCS7Padding 并没有自动填充。(可能其他模式可以,总不能有这个还不能用吧。但是我没有查到 AES/CFB/PKCS7Padding 为什么不填充,如果小伙伴知道还请告知哦!)

    所以我就先试试 ccNoPadding 不填充模式。举例如下:

    原字符串:@"hello中国"

    原数据 Data:<68656c6c 6fe4b8ad e59bbd>

    Java 的PKCS5Padding方式加密后的字符串:QReiy/Ddik50cXQ=

    iOS 的ccNoPadding加密后的字符串:QReiy/DRrn92WV8=

    加密结果当然不一致,下面对 Java 加密字符串解密后进行分析:

    iOS 的ccNoPadding对 Java 加密字符串解密后 data:<68656c6c 6fe4b8ad e59bbd05 05050505>

    iOS 的ccNoPadding对加密字符串解密后 string:@"hello中国\x05\x05\x05\x05\x05"(这里要注意解密后的字符串在控制台输出是没问题的,但是实际是有多余的,如图:)

    可以看出来,因为一个是PKCS5Padding,一个是ccNoPadding 会有填充模式上导致的数据差异。相信看过上面几篇文章的应该明白了。

    如果 Java 加密的填充方式也是用ccNoPadding,那么解出来的就不会有多余填充了。也就是说应该三方都保持同样的ccNoPadding填充方式,我和 Android 测试过(注意 Android 那边应该是 NoPadding书写方式)。

    但是后台那边说多个地方都已经使用 PKCS7Padding。当然解决办法还是有的~~~

    2.3 选错填充方式的补救

    对此,只能我这边采取措施和 Android 、后台保持一致了。

    也就是解密后台给的数据的时,截掉多余的填充;加密传输时,加密后,补充需要填充的数据。这里主要是对 NSData 的操作。

    注意:加解密的步骤(ase64、URL Encode、有的还有字符串替换)不同公司可能采取方式不同,要对接好。

    2.4 代码思路

    在我的项目中,对 NSData 进行填充补位和删除,我们需要了解 PKCS7Padding 的填充方式:

    需要填充的字节长度 = (块长度 - (数据长度 % 块长度))

    假定块长度为 8,数据长度为 3,则填充字节数等于 5。

    原数据为: FF FF FF

    填充结果: FF FF FF 05 05 05 05 05

    假定块长度为 8,数据长度为 8,则填充字节数等于 8。

    原数据为: FF FF FF FF FF FF FF FF

    填充结果: FF FF FF FF FF FF FF FF 08 08 08 08 08 08 08 08

    差多少补多少,不差就补一个块。

    当然我采坑的过程中没那么顺利 ,在此想提醒大家这种不熟悉的任务一定要多批量复杂数据,不能简简单单测试简单少量数据就行了,早发现早解决。

    该处理已在项目中使用上线,使用正常,没有问题。

    2.5 加密方法的实现

    2.5.1 NSData 扩展实现加密解密

    NSData+EHIExtension.h:

    #import

    #include

    interface NSData (EHIExtension)

    /** AES解密:CFB模式 */

    - (NSData *)aes256ByCFBModeWithOperation:(CCOperation)operation key:(NSString *)keyStr iv:(NSString *)ivStr;

    end

    NSData+EHIExtension.m:

    #import "NSData+EHIExtension.h"

    /** AES加密位数 */

    static NSInteger const kEHIAESMode = 16;

    @implementation NSData (EHIExtension)

    /** AES解密:CFB模式 */

    - (NSData *)aes256ByCFBModeWithOperation:(CCOperation)operation key:(NSString *)keyStr iv:(NSString *)ivStr {

    NSData *originData = self;

    if (operation == kCCEncrypt) {

    // 加密:位数不够的补全

    originData = [self fullData:originData mode:kEHIAESMode];

    }

    const char *iv = [[ivStr dataUsingEncoding:NSUTF8StringEncoding] bytes];

    const char *key = [[keyStr dataUsingEncoding:NSUTF8StringEncoding] bytes];

    // 加密/解密

    CCCryptorRef cryptor = NULL;

    CCCryptorStatus status = CCCryptorCreateWithMode(operation,

    kCCModeCFB,

    kCCAlgorithmAES,

    ccNoPadding,

    iv,

    key,

    keyStr.length,

    NULL,

    0,

    0,

    0,

    &cryptor);

    if (status != kCCSuccess) {

    NSLog(@"AES加密/解密失败 error: %@", @(status));

    return nil;

    }

    // 输出加密/解密数据

    NSUInteger inputLength = originData.length;

    char *outData = malloc(inputLength);

    memset(outData, 0, inputLength);

    size_t outLength = 0;

    CCCryptorUpdate(cryptor, originData.bytes, inputLength, outData, inputLength, &outLength);

    NSData *resultData = [NSData dataWithBytes:outData length:outLength];

    CCCryptorRelease(cryptor);

    free(outData);

    if (operation == kCCDecrypt) {

    // 解密:位数多的删除

    resultData = [self deleteData:resultData mode:kEHIAESMode];

    }

    return resultData;

    }

    /** 加密:位数不够的补全

    补位规则:1.length=13,补5位05

    2.length=16,补16位ff */

    - (NSData *)fullData:(NSData *)originData mode:(NSUInteger)mode {

    NSMutableData *tmpData = [[NSMutableData alloc] initWithData:originData];

    // 确定要补全的个数

    NSUInteger shouldLength = mode * ((tmpData.length / mode) + 1);

    NSUInteger diffLength = shouldLength - tmpData.length;

    uint8_t *bytes = malloc(sizeof(*bytes) * diffLength);

    for (NSUInteger i = 0; i < diffLength; i++) {

    // 补全缺失的部分

    bytes[i] = diffLength;

    }

    [tmpData appendBytes:bytes length:diffLength];

    return tmpData;

    }

    /** 解密:位数多的删除

    删位规则:最后一位数字在1-16之间,且连续n位相同n数字 */

    - (NSData *)deleteData:(NSData *)originData mode:(NSUInteger)mode {

    NSMutableData *tmpData = [[NSMutableData alloc] initWithData:originData];

    Byte *bytes = (Byte *)tmpData.bytes;

    Byte lastNo = bytes[tmpData.length - 1];

    if (lastNo >= 1 && lastNo <= mode) {

    NSUInteger count = 0;

    // 确定多余的部分正确性

    for (NSUInteger i = tmpData.length - lastNo; i < tmpData.length; i++) {

    if (lastNo == bytes[i]) {

    count ++;

    }

    }

    if (count == lastNo) {

    // 截取正常的部分

    NSRange replaceRange = NSMakeRange(0, tmpData.length - lastNo);

    return [tmpData subdataWithRange:replaceRange];

    }

    }

    return originData;

    }

    2.5.2 NSString 扩展实现使用过程

    NSString+EHIAES.h:

    #import

    interface NSString (EHIAES)

    /** AES解密 */

    - (NSString *)aes256Decrypt;

    /** AES加密 */

    - (NSString *)aes256Encrypt;

    @end

    NSString+EHIAES.m:

    #import "NSString+EHIAES.h"

    #import "NSString+YYAdd.h"

    #import "NSData+YYAdd.h"

    #import "NSData+EHIExtension.h"

    #import "GTMBase64.h"

    /** AES加密:key */

    static NSString * const kAESKey = @""; // 32位

    /** AES加密:iv */

    static NSString * const kAESIv = @""; // 16位

    @implementation NSString (EHIAES)

    /** AES解密 */

    - (NSString *)ehi_aes256Decrypt {

    // 1.Base64 Decode

    NSData *base64DecodeData = [NSData dataWithBase64EncodedString:self];

    // 1.Aes256 解密

    NSData *decodeData = [base64DecodeData aes256ByCFBModeWithOperation:kCCDecrypt key:kAESKey iv:kAESIv];

    NSString *decodeStr = [[NSString alloc] initWithData:decodeData encoding:NSUTF8StringEncoding];

    if ([NSString isNilOrEmpty:decodeStr]) {

    // 解密失败

    return nil;

    }

    return decodeStr;

    }

    /** AES加密 */

    - (NSString *)ehi_aes256Encrypt {

    NSData *originData = [self dataUsingEncoding:NSUTF8StringEncoding];

    // 1.Aes256 加密

    NSData *encodeData = [originData aes256ByCFBModeWithOperation:kCCEncrypt key:kAESKey iv:kAESIv];

    // 2.Base64 Encode

    NSString *base64EncodeStr = [encodeData base64EncodedString];

    return base64EncodeStr;

    }

    @end

    展开全文
  • 实战篇-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



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

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

    在这里插入图片描述

    展开全文
  • AES加解密总共有以下这些算法/模式/填充 字节加密后数据长度 不满16字节加密后长度AES/CBC/NoPadding 16 不支持AES/CBC/PKCS5Padding 32 16AE...
  • 1. 分别实现 ECB、CBC、CFB、OFB 这四种操作模式的 DES。每种操作模式都有一组对应的测试数据, 以便检查程序的正确性。其中,CFB 操作模式为 8 位 CFB 操作模式,OFB 操作模式为 8 位 OFB 操作模 式。 2. 要求以...
  • 实战篇-OpenSSL之AES加密算法-CFB8模式一、AES简介二、CFB8模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB8模式加解密(3)测试代码 一、AES简介 密码学中的高级加密标准(Advanced Encryption ...
  • 实战篇-OpenSSL之AES加密算法-CFB128模式一、AES简介二、CFB128模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB128模式加解密(3)测试代码 一、AES简介 密码学中的高级加密标准(Advanced ...
  • 实战篇-OpenSSL之TripleDES加密算法-CFB64模式一、TripleDES简介二、CFB64模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB64模式加解密(3)测试代码 一、TripleDES简介 3DES又称Triple DES,是...
  • des ecb cbc CFB OFB

    2017-03-29 15:20:52
    des ecb cbc CFB OFB
  • 实战篇-OpenSSL之TripleDES加密算法-CFB1模式一、TripleDES简介二、CFB1模式1、命令行操作2、函数说明3、编程实现(1)特别注意(2)实现CFB1模式加解密(3)测试代码 一、TripleDES简介 3DES又称Triple DES,是DES...
  • 包含内容:SM4国密加密算法C语言实现 包括 Spec,C代码,测试用例和分组密码有五种工作体制: 1.电码本模式(Electronic Codebook Book (ECB)); 2.密码分组链接模式(Cipher Block Chaining (CBC)); 3.计算器...
  • 1、完整的SM4算法,包括ECB、CBC、CTR、CFB、OFB,C语言实现; 2、内含测试程序,在Linux环境下进入目录后make即可编译,已经在ubuntu16.04环境下编译测试OK; 3、参考GMSSL源码移植而成,做了部分修改; 4、已经在...
  • 常见密码算法总结--(4)加密模式的openssl代码分析之cfb模式 分析CRYPTO_cfb128_encrypt CRYPTO_cfb128_1_encrypt CRYPTO_cfb128_8_encrypt
  • 函数:EVP_des_cbc(void), EVP_des_ecb(void), EVP_des_cfb(void), EVP_des_ofb(void) 说明:分别是CBC方式、ECB方式、CFB方式以及OFB方式的DES算法 【使用两个密钥的3DES算法】 函数:EVP_des_ede_cbc(void), ...
  • 查看完整代码String content = "在线助手";// 生成密钥需要的密码值String key = "www.it399.com";/*** AES加密方式一:AES不指定模式和填充,默认为 ECB/PKCS5Padding** 不能使用填充向量* java.security....
  • 电码本模式(Electronic Codebook Book (ECB));2.密码分组链接模式(Cipher Block Chaining (CBC));3.计算器模式(Counter (CTR));4.密码反馈模式(Cipher FeedBack (CFB));5.输出反馈模式(Output...电码本模式(Elec...
  • 没什么好说的,简单无脑!#includeusing namespace std;int ECB(){int duan[4];int messageLen = 16; //需要加密数据的长度int encLen = 4;... // ECB OFB CFB CTR 初始密码 CBC IV// CTR 计数器从0开始,每组二进制...
  • 这种模式称为128位的CFB模式(又称CFB128)在OpenSSL中用来进行这种加解密的函数为 AES_cfb128_encrypt 1 void AES_cfb128_encrypt ( const unsigned char *in, unsigned char *...
  • 还有加密模式(CBC、ECB、CTR、OCF、CFB等),填充模式(NoPadding、PKCS5Padding、PKCS7Padding等)。本文了解一下加密中的加密模式,不同的加密模式对数据加密的安全度不一样。 0x01:常见的加密模式 电码本...
  • ECB 优点 缺点 ...1.具有操作简单,易于实现的特点 1.不能隐藏明文的模式;...3. 明文中的重复内容会...ECB模式一般只适用于小数据量的字符信息的安全性保护,例如密钥保护。 CBC (Cipher-block chaining)模式 若...
  • AES加解密总共有以下这些算法/模式/填充 字节加密后数据长度 不满16字节加密后长度AES/CBC/NoPadding 16 不支持AES/CBC/PKCS5Padding 32 16AE...
  • 分组加密算法中,有ECB,CBC,CFB,OFB这几种算法模式。 1)ECB(Electronic Code Book)/电码本模式 DES ECB(电子密本方式)事实上很easy。就是将数据依照8个字节一段进行DES加密或解密得到一段8个字节的密文...
  • Q:为什么需要分组模式? A:明文的长度不固定,而分组密码只能处理特定长度的一块数据,这就需要对分组密码的算法进行迭代,以便将一段很长的明文全部加密,而迭代的方法就是分组的模式。 一图全览五种分组模式 五...
  • C语言 DES加解密之CBC和ECB模式

    千次阅读 2019-11-14 19:54:35
    撸了个纯C代码的DES加密,CBC模式 先看下图:(左边是我的,右边是在线加密工具,地址:http://tool.chacuo.net/cryptdes) 可以看到,红框部分是一样的,至于后面的内容不一样应该是因为填充方式导致的,可以看到...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 3,569
精华内容 1,427
关键字:

cfb模式c代码

友情链接: thesis_bennewitz.rar