bit_xor.c

本文通过一个简单的C语言程序展示了位运算中的异或操作如何应用于不同数值间,包括0和0、0和1、1和1、1和2以及15和127之间的运算结果。

  name="google_ads_frame" marginwidth="0" marginheight="0" src="http://pagead2.googlesyndication.com/pagead/ads?client=ca-pub-5572165936844014&dt=1194442938015&lmt=1194190197&format=336x280_as&output=html&correlator=1194442937843&url=file%3A%2F%2F%2FC%3A%2FDocuments%2520and%2520Settings%2Flhh1%2F%E6%A1%8C%E9%9D%A2%2FCLanguage.htm&color_bg=FFFFFF&color_text=000000&color_link=000000&color_url=FFFFFF&color_border=FFFFFF&ad_type=text&ga_vid=583001034.1194442938&ga_sid=1194442938&ga_hid=1942779085&flash=9&u_h=768&u_w=1024&u_ah=740&u_aw=1024&u_cd=32&u_tz=480&u_java=true" frameborder="0" width="336" scrolling="no" height="280" allowtransparency="allowtransparency"> #include <stdio.h>

void main(void)
 {
   printf("0 ^ 0 is %d/n", 0 ^ 0);
   printf("0 ^ 1 is %d/n", 0 ^ 1);
   printf("1 ^ 1 is %d/n", 1 ^ 1);
   printf("1 ^ 2 is %d/n", 1 ^ 2);
   printf("15 ^ 127 is %d/n", 15 ^ 127);
 }

CREATE OR REPLACE FUNCTION HCP.decrypt_id_card( p_hex_cipher IN VARCHAR2 ) RETURN VARCHAR2 IS v_cipher_raw RAW(64); v_key_raw RAW(16) := HEXTORAW(aes_constants.c_key_hex); v_plain_raw RAW(64); -- 修复1:扩大缓冲区至64字节 -- 密钥扩展函数(添加长度检查) FUNCTION key_expansion(round_num NUMBER) RETURN RAW IS v_round_keys SYS.ODCIRAWLIST := SYS.ODCIRAWLIST(); BEGIN IF v_round_keys.COUNT = 0 THEN v_round_keys.EXTEND(11); v_round_keys(1) := v_key_raw; FOR i IN 2..11 LOOP v_round_keys(i) := UTL_RAW.BIT_XOR( v_round_keys(i-1), UTL_RAW.CAST_TO_RAW( RPAD(CHR(i-1), 16, CHR(i-1)) -- 确保16字节长度 ) ); END LOOP; END IF; RETURN v_round_keys(round_num); END; -- 修复列混合函数(添加长度约束) FUNCTION inv_mix_columns(state RAW) RETURN RAW IS v_result RAW(16) := NULL; v_col RAW(4); BEGIN FOR i IN 0..3 LOOP v_col := UTL_RAW.SUBSTR(state, i*4+1, 4); v_result := UTL_RAW.CONCAT( v_result, UTL_RAW.BIT_XOR( v_col, UTL_RAW.CAST_TO_RAW('0F0F0F0F') -- 固定4字节 ) ); END LOOP; RETURN UTL_RAW.SUBSTR(v_result, 1, 16); -- 强制截断为16字节 END; -- 修复解密块函数(添加长度验证) FUNCTION decrypt_block(block RAW) RETURN RAW IS v_state RAW(16) := block; BEGIN -- 初始轮密钥加 v_state := UTL_RAW.BIT_XOR(v_state, key_expansion(11)); FOR round_num IN REVERSE 1..10 LOOP -- 确保每步操作后保持16字节 v_state := UTL_RAW.SUBSTR(inv_shift_rows(v_state), 1, 16); v_state := UTL_RAW.SUBSTR(inv_sub_bytes(v_state), 1, 16); v_state := UTL_RAW.BIT_XOR(v_state, key_expansion(round_num)); IF round_num > 1 THEN v_state := inv_mix_columns(v_state); -- 已内置长度约束 END IF; END LOOP; -- 最终长度验证 IF UTL_RAW.LENGTH(v_state) != 16 THEN RAISE_APPLICATION_ERROR(-20001, '无效块长度: ' || UTL_RAW.LENGTH(v_state)); END IF; RETURN v_state; END; -- 修复填充处理(更安全的实现) FUNCTION remove_padding(data RAW) RETURN VARCHAR2 IS v_data_len NUMBER := UTL_RAW.LENGTH(data); v_pad_byte RAW(1) := UTL_RAW.SUBSTR(data, v_data_len, 1); v_pad_len NUMBER := ASCII(v_pad_byte); BEGIN -- 验证填充有效性 IF v_pad_len BETWEEN 1 AND 16 AND v_pad_len <= v_data_len AND UTL_RAW.SUBSTR(data, v_data_len - v_pad_len + 1, v_pad_len) = RPAD(v_pad_byte, v_pad_len, v_pad_byte) THEN RETURN UTL_RAW.CAST_TO_VARCHAR2( UTL_RAW.SUBSTR(data, 1, v_data_len - v_pad_len) ); END IF; -- 无有效填充时直接返回 RETURN UTL_RAW.CAST_TO_VARCHAR2(data); END; BEGIN aes_constants.init_inv_sbox; v_cipher_raw := HEXTORAW(p_hex_cipher); -- 验证输入长度 IF MOD(UTL_RAW.LENGTH(v_cipher_raw), 16) != 0 THEN RETURN '错误:密文长度必须是16的倍数'; END IF; -- 动态处理多个块 FOR i IN 0..(UTL_RAW.LENGTH(v_cipher_raw)/16 - 1) LOOP v_plain_raw := UTL_RAW.CONCAT( v_plain_raw, decrypt_block(UTL_RAW.SUBSTR(v_cipher_raw, i*16 + 1, 16)) ); END LOOP; RETURN remove_padding(v_plain_raw); EXCEPTION WHEN OTHERS THEN RETURN '解密失败: ' || DBMS_UTILITY.FORMAT_ERROR_STACK; END; / [Error] PLS-00201 (55: 33): PLS-00201: identifier 'INV_SHIFT_ROWS' must be declared [Error] PLS-00201 (56: 33): PLS-00201: identifier 'INV_SUB_BYTES' must be declared
最新发布
08-13
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值