密码软加密

/*EXEC SQL include "mud.h";*/
#include "pberrlog.h"
long sc_decrypt(); 
long sc_encry();
long sc_decrypt_2();
long sc_encry_2();
long ScUnpack();
long ScPack();
long sc_str2hex();
long sc_hex2str();
long ChkCstmPwd();
long GetCstmEncPwd();
long GetCstmPwd();
long CrtCstmPwd();
long BackCstmPwd();

long
ScUnpack(bit, block, blockLen)
unsigned char bit[65];      /* bit array */ 
unsigned char block[9];     /* byte array */
unsigned long blockLen;      /* length of byte array */
{
    unsigned long  i, j;
    unsigned char t;

    for (i = 0; i < blockLen; i++) {
        t = block[i];

        for (j = 0; j < 8; j++)
            bit[8 * i + j] = (unsigned char)((t >> (7 - j)) & 1);
    }
    return 0;
}   

long
ScPack(block, bit, blockLen)
unsigned char block[9];       /* byte array */
unsigned char bit[65];        /* bit array */
unsigned long blockLen;        /* length of byte array */
{       
    unsigned long i, j;
    unsigned char t;
    
    for (i = 0; i < blockLen; i++) {
        t = 0;

        for (j = 0; j < 8; j++)
            t |= bit[8 * i + j] << (7 - j);

        block[i] = t;
    }
    return 0;
}   
    
long
sc_str2hex( str, hex )
unsigned char   *str;
unsigned char   *hex;
{
    long    i;

    memset(hex, 0, sizeof(hex));

    sprintf((char *)hex, "%02X%02X%02X%02X%02X%02X%02X%02X",
                    str[0], str[1], str[2], str[3],
                    str[4], str[5], str[6], str[7]);
    hex[16] = 0;
    return 0;
}

long
sc_hex2str( hex, str )
unsigned char   *hex;
unsigned char   *str;
{
    unsigned int    i, i_char;
    char    tmp[2+1];

    memset(str, 0, sizeof(str));
    tmp[2] = 0;

    for ( i = 0; i < 8; i++)
    {
        tmp[0] = hex[i*2];
        tmp[1] = hex[i*2+1];
        sscanf(tmp, "%x", &i_char);
        str[i] = i_char;
    }

    str[8] = 0;
    return 0;
}

long
sc_encry (tlr_no, original, result)
char tlr_no[7];
unsigned char original[9];
unsigned char result[17];
{
    char trankey_bcd[65];
    char PC_TRANKEY[17];
    unsigned char bkey[65],boriginal[65],bmtext[65];
    long i;

    memset( boriginal,0x00, sizeof( boriginal ) );
    memset( bmtext,0x00, sizeof( bmtext ) );

    ScUnpack( boriginal, original, 8 );

    memset( PC_TRANKEY, 0x00, sizeof( PC_TRANKEY ) );
    memset( trankey_bcd, 0x00, sizeof( trankey_bcd ) );
    dis_tran_key(tlr_no,PC_TRANKEY);
    card_change(PC_TRANKEY,trankey_bcd);
    
    for ( i =0 ; i < 64 ; i++) {
        trankey_bcd[i]-='0';
    }
    
    /* bit key(bkey) & bit text(btext) ---> bit encry text(bmtext) */
    DES_CBS( trankey_bcd, boriginal, bmtext );
    
    ScPack( original, bmtext, 8);
    original[8] = '\0';

    sc_str2hex( original, result );

    return 0;   
}

long
sc_decrypt(tlr_no, mpwd, result)
char tlr_no[7];
unsigned char mpwd[17];
unsigned char result[9];
{
    unsigned char btext[65],bcipher[65],bkey[65];
    unsigned char cipher[9];
    char trankey_bcd[65];
    char PC_TRANKEY[17];
        
    unsigned long i,j,k;
    
    memset( btext,       0, sizeof(btext));
    memset( bcipher,     0, sizeof(bcipher));
    memset( bkey,        0, sizeof(bkey));
    memset( cipher,      0, sizeof(cipher));
    memset( PC_TRANKEY,  0, sizeof(PC_TRANKEY));
    memset( trankey_bcd, 0, sizeof(trankey_bcd));

    cipher[8] = bcipher[64] = btext[64] = bkey[64] = '\0';
  
    sc_hex2str( mpwd, cipher );
    /*?? byte->bit */
    ScUnpack( bcipher, cipher, 8 );
    
    dis_tran_key(tlr_no, PC_TRANKEY);
    card_change(PC_TRANKEY,trankey_bcd);

    for ( i =0 ; i < 64 ; i++) {
        trankey_bcd[i]-='0';
    }
    /* bit key(bkey1) & bit text(btext) ---> bit encry text(bmtext) */
    _DES_CBS( trankey_bcd, bcipher, btext );
    for ( i = 0; i< 64; i ++ )
    for ( i = 0; i< 64; i ++ )
    ScPack( result, btext, 8 );

    result[8] = '\0';
    return 0;
}

long
GetCstmEncPwd(encrypwd, pwd)
char *encrypwd;
char *pwd;
{
    char or_pwd[7];

    memset(or_pwd, 0, sizeof(or_pwd));
    if ( GetCstmPwd(encrypwd, or_pwd) )
        return(-1);

    WriteLog ( DEBUG_LVL0, "cstmpwd=[%s][%s]\n", encrypwd, or_pwd);
    if ( ComPmm(or_pwd, pwd) )
        return(-1);
/* modify by ty 20100125 for CZYH
    if ( SC6000_3Des(1, or_pwd, pwd) )
        return(-1);
*/

    /*
    CBSNewLog(2, "cstmpwd", "cstmpwd=[%s][%s]\n", pwd, or_pwd);
    */


    return(0);
}

long
ChkCstmPwd(encrypwd, pwd)
char *encrypwd;
char *pwd;
{
    char    or_pwd[17];

    memset(or_pwd, 0, sizeof(or_pwd));

    if(strlen(encrypwd)>6)
    {
        if ( GetCstmEncPwd(encrypwd, or_pwd) )
            return(-1);
    }
    else
    {
       strcpy(or_pwd,encrypwd);
    }
    return(strcmp(pwd,or_pwd));
}   
    
long
CrtCstmPwd(or_pwd, pwd)
char *or_pwd; 
char *pwd; 
{
    /*
    CBSNewLog(2, "cstmpwd", "cstmpwd=[%s]\n", or_pwd);
    */
/*
    if ( SC6000_3Des(1, or_pwd, pwd) )
        return(-1);
*/  
    if ( ComPmm(or_pwd, pwd) )
        return(-1);
    return(0);
}       

long
sc_encry_2 (original, result)
unsigned char original[9];
unsigned char result[17];
{   
    char trankey_bcd[65];
    char PC_TRANKEY[17];
    unsigned char bkey[65],boriginal[65],bmtext[65];
    long i;
    
    memset( boriginal,0x00, sizeof( boriginal ) );
    memset( bmtext,0x00, sizeof( bmtext ) );

    ScUnpack( boriginal, original, 8 );

    memset( PC_TRANKEY, 0x00, sizeof( PC_TRANKEY ) );
    memset( trankey_bcd, 0x00, sizeof( trankey_bcd ) );
    strcpy( PC_TRANKEY, "1234567890987654");
    card_change(PC_TRANKEY,trankey_bcd);

    for ( i =0 ; i < 64 ; i++) {
        trankey_bcd[i]-='0';
    }
    
    /* bit key(bkey) & bit text(btext) ---> bit encry text(bmtext) */
    DES_CBS( trankey_bcd, boriginal, bmtext );
    
    ScPack( original, bmtext, 8);
    original[8] = '\0';
    
    sc_str2hex( original, result );
    
    return 0;
}   
long
sc_decrypt_2(mpwd, result)
unsigned char mpwd[17];
unsigned char result[9];
{
    unsigned char btext[65],bcipher[65],bkey[65];
    unsigned char cipher[9];
    char trankey_bcd[65];
    char PC_TRANKEY[17];

    unsigned long i,j,k;

    memset( btext,       0, sizeof(btext));
    memset( bcipher,     0, sizeof(bcipher));
    memset( bkey,        0, sizeof(bkey));
    memset( cipher,      0, sizeof(cipher));
    memset( PC_TRANKEY,  0, sizeof(PC_TRANKEY));
    memset( trankey_bcd, 0, sizeof(trankey_bcd));

    cipher[8] = bcipher[64] = btext[64] = bkey[64] = '\0';

    sc_hex2str( mpwd, cipher );
    /*?? byte->bit */
    ScUnpack( bcipher, cipher, 8 );

    strcpy( PC_TRANKEY, "1234567890987654");
    card_change(PC_TRANKEY,trankey_bcd);

    for ( i =0 ; i < 64 ; i++) {
        trankey_bcd[i]-='0';
    }
    /* bit key(bkey1) & bit text(btext) ---> bit encry text(bmtext) */
    _DES_CBS( trankey_bcd, bcipher, btext );

    for ( i = 0; i< 64; i ++ )
    for ( i = 0; i< 64; i ++ )
    ScPack( result, btext, 8 );

    result[8] = '\0';
    return 0;
}

/*设置空函数 编译用*/
int
SC6000_3Des(int type,char *old_pwd,char *des_pwd)
{
     return(0);
}

### 考中加密算法的相关知识 #### 非对称加密算法概述 非对称加密算法是一种基于两把不同密钥(公钥和私钥)的加密技术。其核心特点是,如果用公钥对数据进行加密,则只有对应的私钥能够解密;同样地,如果用私钥加密数据,则需要用公钥来解密[^1]。 #### 常见的非对称加密算法 以下是考中可能涉及的一些常见非对称加密算法及其特点: 1. **RSA (Rivest-Shamir-Adleman)** RSA 是一种广泛使用的非对称加密算法,主要依赖于大素数分解的难度。它的安全性建立在因式分解难题之上,适用于数字签名和密钥交换场景[^1]。 2. **ECC (Elliptic Curve Cryptography, 椭圆曲线密码学)** ECC 使用椭圆曲线上点的运算作为基础,相比传统算法,在相同安全强度下所需的密钥长度更短,因此更适合资源受限环境下的应用[^1]。 3. **DSA (Digital Signature Algorithm, 数字签名算法)** DSA 主要用于生成和验证数字签名,不支持直接的数据加密功能。它是美国国家标准与技术研究院(NIST)推荐的标准之一[^1]。 4. **ElGamal** ElGamal 是另一种经典的非对称加密方案,基于离散对数问题的安全假设。它可以用来实现保密通信和数字签名。 #### 加密算法的应用场景 在考中,考生需要理解每种加密算法的具体应用场景: - 数据传输保护:通过非对称加密机制保障网络通信过程中的信息安全。 - 密钥协商:利用 Diffie-Hellman 协议或其他方法完成双方共享秘密密钥的分配。 - 数字签名:提供消息完整性校验及发送方身份认证的功能。 #### 可能出现的题型 针对以上知识点,考试可能会设置如下类型的题目: 1. 判断某种特定情况下应选用哪种加密方式; 2. 计算简单示例中的加密/解密结果; 3. 解析给定案例并指出潜在安全隐患所在之处。 ```python from Crypto.PublicKey import RSA # 创建一对新的 RSA 密钥对象 key_pair = RSA.generate(2048) print(f"Public Key:\n{key_pair.publickey().export_key()}") print(f"\nPrivate Key:\n{key_pair.export_key()}") ``` 此代码片段展示了如何使用 Python 的 `pycryptodome` 库生成一组标准的 2048-bit RSA 公私钥对[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值