生活随笔
收集整理的這篇文章主要介紹了
位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
有參數(shù)交換數(shù)據(jù) 無參數(shù)交換數(shù)據(jù) 異或加密(文本與二進(jìn)制) 循環(huán)移位加密(文本與二進(jìn)制)
有參數(shù)交換數(shù)據(jù)
#include <stdio.h> void MySwap ( int * pa
, int * pb
)
{ int tmp
= * pa
; * pa
= * pb
; * pb
= tmp
;
} int main ( )
{ int a
= 3 ; int b
= 5 ; printf ( "a = %d\t b = %d\n" , a
, b
) ; MySwap ( & a
, & b
) ; printf ( "a = %d\t b = %d\n" , a
, b
) ; return 0 ;
}
運(yùn)行結(jié)果為:
#include <stdio.h> void MySwap ( int * pa
, int * pb
)
{ * pa
= * pa
+ * pb
; * pb
= * pa
- * pb
; * pa
= * pa
- * pb
;
} int main ( )
{ int a
= 3 ; int b
= 5 ; printf ( "a = %d\t b = %d\n" , a
, b
) ; MySwap ( & a
, & b
) ; printf ( "a = %d\t b = %d\n" , a
, b
) ; return 0 ;
}
運(yùn)行結(jié)果為:
無參數(shù)交換數(shù)據(jù)
#include <stdio.h> void MySwap ( int * pa
, int * pb
)
{ * pa
= * pa
^ * pb
; * pb
= * pb
^ * pa
; * pa
= * pa
^ * pb
;
} int main ( )
{ int a
= 3 ; int b
= 5 ; printf ( "a = %d\t b = %d\n" , a
, b
) ; MySwap ( & a
, & b
) ; printf ( "a = %d\t b = %d\n" , a
, b
) ; return 0 ;
}
運(yùn)行結(jié)果為:
使用 ^ 進(jìn)行數(shù)據(jù)交換能夠避免出現(xiàn)溢出。
無參數(shù)交換數(shù)據(jù)是數(shù)據(jù)交換的最高境界。
異或加密(文本與二進(jìn)制)
key 為單個(gè)字符
注意,加密過程中相同字符異或有’\0’的出現(xiàn)。要濾過以防數(shù)據(jù)截?cái)?#xff0c;因?yàn)槲覀円廊粫?huì)它當(dāng)成字符串進(jìn)行處理。
key 為字符串
#include <stdio.h>
#include <string.h> void encode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) buf
[ i
] ^ = ch
;
} void decode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) buf
[ i
] ^ = ch
;
} int main ( )
{ char buf
[ ] = "i love c++" ; printf ( "buf = %s\n" , buf
) ; char ch
= 'a' ; encode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; decode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; return 0 ;
}
運(yùn)行結(jié)果為:
在這里需要注意的是,字符ch不能和我們加密的數(shù)據(jù)出現(xiàn)相同的字符,否則加密之后無法解密。取 ^ 之后的值為 0 ,也會(huì)導(dǎo)致字符串結(jié)束。 代碼演示:
#include <stdio.h>
#include <string.h> void encode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) buf
[ i
] ^ = ch
;
} void decode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) buf
[ i
] ^ = ch
;
} int main ( )
{ char buf
[ ] = "i love c++" ; printf ( "buf = %s\n" , buf
) ; char ch
= 'o' ; encode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; decode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; return 0 ;
}
運(yùn)行結(jié)果為:
我們可以看到加密和解密失敗。
所以我們需要對(duì)于代碼進(jìn)行優(yōu)化: 代碼演示:
#include <stdio.h>
#include <string.h> void encode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) { if ( buf
[ i
] == ch
) continue ; buf
[ i
] ^ = ch
; } } void decode ( char * buf
, char ch
)
{ int len
= strlen ( buf
) ; for ( int i
= 0 ; i
< len
; i
++ ) { if ( buf
[ i
] == ch
) continue ; buf
[ i
] ^ = ch
; }
} int main ( )
{ char buf
[ ] = "i love c++" ; printf ( "buf = %s\n" , buf
) ; char ch
= 'o' ; encode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; decode ( buf
, ch
) ; printf ( "buf = %s\n" , buf
) ; int a
= 12345 ; a
^ = a
; printf ( "a= %d\n" , a
) ; return 0 ;
}
運(yùn)行結(jié)果為:
我們看到加密解密成功并且驗(yàn)證了任何一個(gè)值的 ^ 為0。
我們接下來增加一下難度:我們通過密文輸入密碼進(jìn)行查看原來的數(shù)據(jù)。 加密圖解說明: 通過上面過程對(duì)于數(shù)據(jù)進(jìn)行加密,數(shù)據(jù)的長(zhǎng)度控制主循環(huán)的結(jié)束。 代碼演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
void encode ( char * buf
, char * px
)
{ int len
= strlen ( buf
) ; int n
= strlen ( px
) ; int j
= 0 ; for ( int i
= 0 ; i
< len
; i
++ ) { if ( buf
[ i
] == px
[ j
] ) { j
++ ; } else { buf
[ i
] ^ = px
[ j
] ; if ( j
== n
) j
= 0 ; } }
} void decode ( char * buf
, char * px
)
{ int len
= strlen ( buf
) ; int n
= strlen ( px
) ; int j
= 0 ; for ( int i
= 0 ; i
< len
; i
++ ) { if ( buf
[ i
] == px
[ j
] ) { j
++ ; } else { buf
[ i
] ^ = px
[ j
] ; if ( j
== n
) j
= 0 ; } }
} int main ( )
{ char buf
[ ] = "i love c++" ; char xx
[ ] = "19990909" ; encode ( buf
, xx
) ; char buf1
[ 1024 ] ; printf ( "請(qǐng)輸入解密密碼:" ) ; scanf ( "%s" , buf1
) ; printf ( "buf = %s\n" , buf
) ; decode ( buf
, buf1
) ; printf ( "buf = %s\n" , buf
) ; return 0 ;
}
運(yùn)行結(jié)果為: 成功解密:
解密失敗演示:
如果是對(duì)于二進(jìn)制進(jìn)行加密,如果出現(xiàn) ^ 結(jié)果為0則不會(huì)對(duì)于結(jié)果造成影響。
循環(huán)移位加密(文本與二進(jìn)制)
位運(yùn)算的加密應(yīng)用,這才是真正意義上的加密的開始。 我們對(duì)圖片進(jìn)行循環(huán)移位加密: 需要加密的圖片: 先把需要加密的圖片放在程序操作的文件目錄中:
代碼演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void encode ( char * buf
, int n
)
{ for ( int i
= 0 ; i
< n
; i
++ ) { unsigned char ch
= buf
[ i
] ; buf
[ i
] = ( ch
<< 1 ) | ( ch
>> 7 ) ; }
} int main ( )
{ FILE
* pfr
= fopen ( "01.png" , "rb+" ) ; if ( NULL == pfr
) exit ( - 1 ) ; FILE
* pfw
= fopen ( "02.png" , "wb+" ) ; if ( NULL == pfw
) exit ( - 1 ) ; char buf
[ 1024 ] ; int n
= 0 ; while ( ( n
= fread ( buf
, 1 , 1024 , pfr
) ) > 0 ) { encode ( buf
, n
) ; fwrite ( buf
, 1 , n
, pfw
) ; } fclose ( pfr
) ; fclose ( pfw
) ; return 0 ;
}
運(yùn)行結(jié)果為: 我們可以看到加密成功。
接下來我們進(jìn)行解密操作。 代碼演示:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h> void encode ( char * buf
, int n
)
{ for ( int i
= 0 ; i
< n
; i
++ ) { unsigned char ch
= buf
[ i
] ; buf
[ i
] = ( ch
<< 1 ) | ( ch
>> 7 ) ; }
} void decode ( char * buf
, int n
)
{ for ( int i
= 0 ; i
< n
; i
++ ) { unsigned char ch
= buf
[ i
] ; buf
[ i
] = ( ch
>> 1 ) | ( ch
<< 7 ) ; }
} int main ( )
{ FILE
* pfr
= fopen ( "02.png" , "rb+" ) ; if ( NULL == pfr
) exit ( - 1 ) ; FILE
* pfw
= fopen ( "03.png" , "wb+" ) ; if ( NULL == pfw
) exit ( - 1 ) ; char buf
[ 1024 ] ; int n
= 0 ; while ( ( n
= fread ( buf
, 1 , 1024 , pfr
) ) > 0 ) { decode ( buf
, n
) ; fwrite ( buf
, 1 , n
, pfw
) ; } fclose ( pfr
) ; fclose ( pfw
) ; return 0 ;
}
運(yùn)行結(jié)果為:
我們可以看到揭秘成功。 注意: 循環(huán)移位加密不用擔(dān)心會(huì)出現(xiàn) 0 的情況,因?yàn)閿?shù)據(jù)中不會(huì)出現(xiàn) 0,所以循環(huán)移位也不會(huì)出現(xiàn) 0 。
總結(jié)
以上是生活随笔 為你收集整理的位操作的应用:无参数交换数据,异或加密,循环移位加密【位操作】(56) 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。