Hash 基于SHA-256散列函数的简单分组密码

Hash 基于SHA-256散列函数的简单分组密码,hash,cryptography,sha256,encryption,Hash,Cryptography,Sha256,Encryption,我提出了一个使用SHA-2(本例中为SHA-256)散列函数进行加密的小例程。因此,它是一种具有256位(32字节)块大小和任意密钥长度的分组密码。很容易看出,您可以替换哈希函数,得到一种全新类型的算法 我想知道在这种结构中是否存在任何问题,特别是缺陷,以及是否研究过这种类型的算法 #include <openssl/sha.h> struct sha_crypt_state { unsigned char digest[SHA256_DIGEST_LENGTH]; };

我提出了一个使用SHA-2(本例中为SHA-256)散列函数进行加密的小例程。因此,它是一种具有256位(32字节)块大小和任意密钥长度的分组密码。很容易看出,您可以替换哈希函数,得到一种全新类型的算法

我想知道在这种结构中是否存在任何问题,特别是缺陷,以及是否研究过这种类型的算法

#include <openssl/sha.h>

struct sha_crypt_state {
    unsigned char digest[SHA256_DIGEST_LENGTH];
};

void sha_crypt_set_key( sha_crypt_state *state, unsigned char *key, int key_length )
{
    SHA256( key, key_length, state->digest );
}

void sha_crypt( sha_crypt_state *state, unsigned char *block )
{
    sha_crypt_state temp;
    SHA256( state->digest, sizeof(state->digest), temp.digest );
    memcpy( state->digest, temp.digest, sizeof(temp.digest) );

    for ( int i = 0; i < sizeof(state->digest); ++i ) {
        block[i] ^= state->digest[i];
    }
}

void sha_crypt_test()
{
    const char *key = "secret";

    // prepare a test block
    char block[SHA256_DIGEST_LENGTH];
    memset( block, 0, sizeof(block) );
    strcpy( block, "Hello, testing encryption!" );

    // test encrypt
    sha_crypt_state state;
    set_key( &state, (unsigned char *)key, strlen(key) );
    sha_crypt( &state, (unsigned char *)block );

    // test decrypt
    set_key( &state, (unsigned char *)key, strlen(key) );
    sha_crypt( &state, (unsigned char *)block );
}
#包括
结构sha_crypt_state{
无符号字符摘要[SHA256_摘要_长度];
};
void sha_crypt_set_key(sha_crypt_state*state,unsigned char*key,int key_length)
{
SHA256(键、键长、状态->摘要);
}
void sha_crypt(sha_crypt_state*state,unsigned char*块)
{
沙乌地穴州温度;
SHA256(状态->摘要,sizeof(状态->摘要),临时摘要);
memcpy(state->digest,temp.digest,sizeof(temp.digest));
对于(inti=0;idigest);+i){
块[i]^=状态->摘要[i];
}
}
void sha_crypt_test()
{
const char*key=“secret”;
//准备一块试块
字符块[SHA256_摘要_长度];
memset(block,0,sizeof(block));
strcpy(block,“你好,正在测试加密!”);
//测试加密
沙乌地穴州;
设置_键(&state,(unsigned char*)键,strlen(键));
sha_crypt(&state,(未签名字符*)块);
//测试解密
设置_键(&state,(unsigned char*)键,strlen(键));
sha_crypt(&state,(未签名字符*)块);
}

一个明显的缺点是,如果我能猜出任何块的明文-例如,如果您正在加密一个具有静态头的Word文档-我可以解密以下所有块(只需将明文与密文进行异或即可生成状态)


基于哈希函数的分组密码通常只使用哈希算法的压缩函数。一个例子是基于SHA-256的算法,就像你的算法一样。

这个问题应该问得更好,尽管我怀疑你在那里得到的主要答案是“不要重新发明轮子”。谢谢,我也会在那里发布。跨站点复制: