我已经提出了使用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 );
}
答案 0 :(得分:1)
一个明显的缺点是,如果我能猜出任何块的明文 - 例如,如果你正在加密一个具有静态头文件的Word文档 - 我可以解密以下所有块(只是用明文和明文的x文本)产生状态)。
基于散列函数的分组密码通常仅使用散列算法的压缩函数。一个例子是SHACAL-2,它与您的算法一样基于SHA-256。