Hash 基于SHA-256散列函数的简单分组密码
我提出了一个使用SHA-2(本例中为SHA-256)散列函数进行加密的小例程。因此,它是一种具有256位(32字节)块大小和任意密钥长度的分组密码。很容易看出,您可以替换哈希函数,得到一种全新类型的算法 我想知道在这种结构中是否存在任何问题,特别是缺陷,以及是否研究过这种类型的算法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]; };
#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的算法,就像你的算法一样。这个问题应该问得更好,尽管我怀疑你在那里得到的主要答案是“不要重新发明轮子”。谢谢,我也会在那里发布。跨站点复制: