标准字头密码

#include
#include
#include
typedef struct tagKeywordTable
{
    char p;
    char c;
}KeywordTable;
void cst_keyword_table (char *key);
void prnt_keyword_table ();
int keyword_encrypt (char *plain_txt, char *cipher_txt);
int keyword_decrypt (char *cipher_txt, char *plain_txt);
KeywordTable keyword_table[26];
void cst_keyword_table (char *in_key)
{
    int i = 0, j, k;
    int char_count = 0, left_ch_index = 0;
    char ch, left_chs[26] = {0}, key[26] = {0};
    int key_len;
    strcpy (key, in_key);
    key_len = strlen (key);
    while (1)
    {
        if (key[i] == ‘ ‘)
        {
            for (j = i; j < key_len - 1; ++j)
                key[j] = key[j + 1];
            key_len--;
        }
        if (i == key_len)
            break;
        i++;
    }
    for (i = 0; i < 26; ++i)
    {
        ch = ‘a‘ + i;
        j = 0;
        char_count = 0;
        while (1)
        {
            if (key[j] == ch)
            {
                char_count++;
                if (char_count > 1)
                {
                    for (k = j; k < key_len -1; ++k)
                        key[k] = key[k + 1];
                    key_len--;
                }
                else
                    j++;
            }
            else
                j++;
            if (j == key_len)
                break;
        }
        if (char_count == 0)
            left_chs[left_ch_index++] = ch;
    }

    for (i = 0; i < left_ch_index; ++i)
        key[key_len++] = left_chs[i];
    for (i = 0; i < 26; ++i)
    {
        keyword_table[i].p = ‘a‘ + i;
        keyword_table[i].c = key[i];
    }
}

void prnt_keyword_table ()
{
    int i;
    printf ("Plain:\t");
    for (i = 0; i < 26; ++i)
        printf ("%c ", keyword_table[i].p);
    printf ("\nCipher:\t");
    for (i = 0; i < 26; ++i)
        printf ("%c ", keyword_table[i].c);
    puts("\n");
}

int keyword_encrypt (char *plain_txt, char *cipher_txt)
{
    int length = strlen (plain_txt);
    int i;
    for (i = 0; i < length; ++i)
    {
        if (plain_txt[i] >= ‘a‘ && plain_txt[i] <= ‘z‘)
        {
            cipher_txt[i] = keyword_table[plain_txt[i] - ‘a‘].c;
        }
        else if (plain_txt[i] >= ‘A‘ && plain_txt[i] <= ‘Z‘)
        {
            cipher_txt[i] = keyword_table[plain_txt[i] - ‘A‘].c - 32;
        }
        else
            cipher_txt[i] = plain_txt[i];
    }
    cipher_txt[length] = ‘\0‘;

    return length;
}
int main ()
{
    char plain_txt[1000], cipher_txt[1000];
    char key[26] = {0};
    printf ("请输入你的密钥: ");
    scanf ("%s", key);
    cst_keyword_table (key);
    printf ("标准字头密码体制的密表为:\n");
    prnt_keyword_table ();
    printf ("现在输入明文: ");
    scanf ("%s", plain_txt);
    keyword_encrypt (plain_txt, cipher_txt);
    printf ("加密后的密文为 : %s\n", cipher_txt);
    return 0;
}
****************************************************************************************
解密
#include
#include
#include
typedef struct tagKeywordTable
{
        char p;
        char c;
}KeywordTable;
void cst_keyword_table (char *key);
void prnt_keyword_table ();
int keyword_encrypt (char *plain_txt, char *cipher_txt);
int keyword_decrypt (char *cipher_txt, char *plain_txt);
KeywordTable keyword_table[26];
void cst_keyword_table (char *in_key)
{
        int i = 0, j, k;
        int char_count = 0, left_ch_index = 0;
        char ch, left_chs[26] = {0}, key[26] = {0};
        int key_len;
        strcpy (key, in_key);
        key_len = strlen (key);
        while (1)
        {
                if (key[i] == ‘ ‘)
                {
                        for (j = i; j < key_len - 1; ++j)
                                key[j] = key[j + 1];
                        key_len--;
                }
                if (i == key_len)
                        break;
                i++;
        }
        for (i = 0; i < 26; ++i)
        {
                ch = ‘a‘ + i;
                j = 0;
                char_count = 0;
                while (1)
                {
                        if (key[j] == ch)
                        {
                                char_count++;
                                if (char_count > 1)
                                {
                                        for (k = j; k < key_len -1; ++k)
                                                key[k] = key[k + 1];
                                        key_len--;
                                }
                                else
                                        j++;
                        }
                        else
                                j++;
                        if (j == key_len)
                                break;
                }
                if (char_count == 0)
                        left_chs[left_ch_index++] = ch;
        }
        for (i = 0; i < left_ch_index; ++i)
                key[key_len++] = left_chs[i];
        for (i = 0; i < 26; ++i)
        {
                keyword_table[i].p = ‘a‘ + i;
                keyword_table[i].c = key[i];
        }
}
void prnt_keyword_table ()
{
        int i;
        printf ("Plain:\t");
        for (i = 0; i < 26; ++i)
                printf ("%c ", keyword_table[i].p);
        printf ("\nCipher:\t");
        for (i = 0; i < 26; ++i)
                printf ("%c ", keyword_table[i].c);
        puts("\n");
}

int keyword_decrypt (char *cipher_txt, char *plain_txt)
{
        int length = strlen (cipher_txt);
        int i, j;
        for (i = 0; i < length; ++i)
        {
                if (cipher_txt[i] >= ‘a‘ && cipher_txt[i] <= ‘z‘)
                {
                        for (j = 0; j < 26; ++j)
                        {
                                if (keyword_table[j].c == cipher_txt[i])
                                {
                                        plain_txt[i] = keyword_table[j].p;
                                        break;
                                }
                        }
                }
                else if (cipher_txt[i] >= ‘A‘ && cipher_txt[i] <= ‘Z‘)
                {
                        for (j = 0; j < 26; ++j)
                        {
                                if (keyword_table[j].c == cipher_txt[i] + 32)
                                {
                                        plain_txt[i] = keyword_table[j].p - 32;
                                        break;
                                }
                        }

                }
                else
                        plain_txt[i] = cipher_txt[i];
        }
        plain_txt[length] = ‘\0‘;
        return length;
}
int main ()
{
        char plain_txt[1000], cipher_txt[1000];
        char key[26] = {0};
        printf ("请输入你的密钥: ");
        scanf ("%s", key);
        cst_keyword_table (key);
        printf ("标准字头密码体制的密表为:\n");
        prnt_keyword_table ();
        printf ("输入原密文: ");
        scanf ("%s", cipher_txt);
        keyword_decrypt (cipher_txt, plain_txt);
        printf ("则原明文为:%s\n", plain_txt);

        return 0;
}
****************************************************************************************
时间: 2024-11-05 11:35:47

标准字头密码的相关文章

MySQL 5.7 密码策略

在MySQL 5.7版本中,用户密码策略分成低级LOW.中等MEDIUM和超强STRONG三种,推荐使用中等MEDIUM级别. 我们在安装MySQL的时候,会通过如下命令来设置用户密码策略: shell> mysql_secure_installation 使用如下命令查看现有的密码策略 mysql> SHOW VARIABLES LIKE 'validate_password%'; validate_password_number_count参数是密码中至少含有的数字个数,当密码策略是MED

如何安全的存储用户密码?

原文链接:请猛击 本文我只截取了一小部分知识,请看原文. 一:基础知识:加盐哈希( Hashing with Salt) 我们已经知道,恶意攻击者使用查询表和彩虹表,破解普通哈希加密有多么快.我们也已经 了解到,使用随机加盐哈希可以解决这个问题.但是,我们使用什么样的盐值,又如何将其 混入密码中? 盐值应该使用加密的安全伪随机数生成器( Cryptographically Secure Pseudo-Random Number Generator,CSPRNG )产生.CSPRNG和普通的伪随机

mysql5.7 密码策略

查看现有的密码策略 mysql> SHOW VARIABLES LIKE 'validate_password%';+--------------------------------------+--------+| Variable_name | Value |+--------------------------------------+--------+| validate_password_dictionary_file | || validate_password_length | 8

Go标准库

bufio 实现缓冲的I/O bytes 提供了对字节切片操作的函数 crypto 收集了常见的加密常数 errors 实现了操作错误的函数 Expvar 为公共变量提供了一个标准的接口,如服务器中的运算计数器 flag 实现了命令行标记解析 fmt 实现了格式化输入输出 hash 提供了哈希函数接口 html 实现了一个HTML5兼容的分词器和解析器 image 实现了一个基本的二维图像库 io 提供了对I/O原语的基本接口 log 它是一个简单的记录包,提供最基本的日志功能 math 提供了

CTF中那些脑洞大开的编码和加密

0x00 前言 正文开始之前先闲扯几句吧,玩CTF的小伙伴也许会遇到类似这样的问题:表哥,你知道这是什么加密吗?其实CTF中脑洞密码题(非现代加密方式)一般都是各种古典密码的变形,一般出题者会对密文进行一些处理,但是会给留一些线索,所以写此文的目的是想给小伙伴做题时给一些参考,当然常在CTF里出现的编码也可以了解一下.本来是想尽快写出参考的文章,无奈期间被各种事情耽搁导致文章断断续续写了2个月,文章肯定有许多没有提及到,欢迎小伙伴补充,总之,希望对小伙伴们有帮助吧! 0x01 目录 1 2 3

OpenSSH 密钥管理:RSA/DSA 认证(转载)

我们中有许多人把优秀的 OpenSSH用作古老的 telnet 和 rsh 命令的替代品,OpenSSH 不仅是安全的而且是加密的. OpenSSH 更加吸引人的特性之一是它能够使用基于一对互补的数字式密钥的 RSA 和 DSA 认证协议来认证用户.RSA 和 DSA 认证承诺 不必提供密码就能够同远程系统建立连接,这是它的主要魅力之一.虽然这非常吸引人,但是 OpenSSH 的新用户们常常以一种快速却不完善的方式配置 RSA/DSA,结果虽然实现了无密码登录,却也在此过程中开了一个很大的安全漏

SecureCRT使用

1.SecureCRT简介 SecureCRT是一款支持SSH(SSH1和SSH2)的终端仿真程序,同时支持Telnet和rlogin协议.SecureCRT是一款用于连接运行包括Windows.UNIX和VMS的远程系统的理想工具.通过使用内含的VCP命令行程序可以进行加密文件的传输.有流行CRTTelnet客户机的所有特点,包括:自动注册.对不同主机保持不同的特性.打印功能.颜色设置.可变屏幕尺寸.用户定义的键位图和优良的VT100,VT102,VT220和ANSI竞争.能从命令行中运行或从

SSH安全加固

清空SSH登录的bannner   默认为空 清除ssh的版本信息 # strings /usr/sbin/sshd | grep 6.6 # sed -i 's/OpenSSH_6.6.1/OpenSSH_8.8/g'/usr/sbin/sshd SSH使用版本2 # Protocol = 2 不允许root远程登录: # PermitRootLogin no #禁止root登录SSH 不允许空密码 不允许rlogin.rhost登录 # IgnoreRhosts =yes: 配置并限制允许登

OpenSSH的RSA/DSA密钥认证系统

OpenSSH的RSA/DSA密钥认证系统,它可以代替OpenSSH缺省使用的标准安全密码认证系统. OpenSSH的RSA和DSA认证协议的基础是一对专门生成的密钥,分别叫做私用密钥和公用密钥. 使用这些基于密钥的认证系统的优势在于:在许多情况下,有可能不必手工输入密码就能建立起安全的连接.尽管基于密钥的认证协议相当安全,但是当用户并不完全了解这些简化操作对安全性的影响,为了方便而使用某些简化操作时,就会出现问题. 公用密钥用于对消息进行加密,只有拥有私用密钥的人才能对该消息进行解密.公用密钥