如何加密/混亂C語言源代碼
4 人贊了文章
據說每個嵌入式工程師或軟體工程師都有把清晰的程序搞得一團混亂的潛能,今天小編來手把手教(zuo)學(si),哈哈<( ̄3 ̄)> !
下面是以素數探求程序為例,教你如何加密源碼。
開始程序
下面是素數探求的程序:
1
23
45678910111213
141516171819202122void primes(int cap)
{ int i, j, composite; for(i = 2; i < cap; ++i) { composite = 0; for(j = 2; j * j < i; ++j) { composite += !(i % j);}
if(!composite) { printf("%dt", i); } }}int main(){ primes(100);}
下面我們來看看如何把上面這段代碼搞得複雜難懂。
第一步、把for變成while
通常來說,for循壞要以while循壞簡單一些,上面的程序有二重for循環,我們不但要把其變成while循環,而且還要把二重循環的變成一重的循環,然後使用大量的if-else語句來判斷。
1
2345678
9101112131415161718
19202122void primes(int cap)
{ int i, j, composite, t = 0; while(t < cap * cap){
i = t / cap; j = t++ % cap; if(i <= 1); else if(!j) composite = j; else if(j == i && !composite) printf("%dt", i); else if(j > 1 && j < i) composite += !(i % j);}
}int main(){ primes(100);}第二步,把循壞變成遞歸
遞歸在某些時候是可以把代碼變得簡單,但大多數的情況下是把代碼變得複雜,而且很沒有效率。下面是把上面的while循環變成了遞歸。變成了遞歸後,函數的參數都變成3個了。
1
23456789101112131415161718192021void primes(int cap, int t, int composite)
{ int i, j; i = t / cap; j = t % cap; if(i <= 1) primes(cap, t + 1, composite); else if(!j) primes(cap, t + 1, j); else if(j == i && !composite) (printf("%dt", i), primes(cap, t + 1, composite)); else if(j > 1 && j < i) primes(cap, t + 1, composite + !(i % j)); else if(t < cap * cap) primes(cap, t + 1, composite);}int main(){ primes(100, 0, 0);}第三步,弄亂代碼結構/使用沒有含義的變數名
關於如何弄亂代碼結構,其中一個小技巧是,使用「?」表達式代替if-else語句。
1
234567891011121314void primes(int m, int t, int c)
{ int i, j; i = t / m; j = t % m; (i <= 1) ? primes(m, t + 1, c) : (!j) ? primes(m, t + 1, j) : (j == i && !c) ? (printf("%dt", i), primes(m, t + 1, c)) : (j > 1 && j < i) ? primes(m, t + 1, c + !(i % j)) : (t < m * m) ? primes(m, t + 1, c) : 0;}int main(){ primes(100, 0, 0);}第四步,取消臨時變數
臨時變數一般用來保存反覆使用的一個表達式的值。使用大量重複的表達式來取消這些臨時變數的也可以讓代碼複雜起來。
1
23456789101112void primes(int m, int t, int c)
{ ((t / m) <= 1) ? primes(m, t + 1, c) : !(t % m) ? primes(m, t + 1, t % m) : ((t % m) == (t / m) && !c) ? (printf("%dt", (t / m)), primes(m, t + 1, c)) : ((t % m) > 1 && (t % m) < (t / m)) ? primes(m, t + 1, c + !((t / m) % (t % m))) : (t < m * m) ? primes(m, t + 1, c) : 0;}int main(){ primes(100, 0, 0);}第五步,繼續弄亂變數名
我們知道,下劃線是合法的變數名,所以,我們不妨用__,___,____來代替m,t,c。函數名也可以使用下劃線來代替。讓我們來看看求素數的函數能變成什麼。
1
2345678910111213void _(int __, int ___, int ____)
{ ((___ / __) <= 1) ? _(__, ___ + 1, ____) : !(___ % __) ? _(__, ___ + 1, ___ % __) : ((___ % __) == (___ / __) && !____) ? (printf("%dt", (___ / __)), _(__, ___ + 1, ____)) : ((___ % __) > 1 && (___ % __) < (___ / __)) ? _(__, ___ + 1, ____ + !((___ / __) % (___ % __))) : (___ < __ * __) ? _(__, ___ + 1, ____) : 0;}int main(){ _(100, 0, 0);}第六步,移除常量
在上面的程序中,還有一些常量,你可以通過增加一個宏定義,或是增加一個函數的形參來取代這一常量。
1
2345678910111213void _(int __, int ___, int ____, int _____)
{ ((___ / __) <= _____) ? _(__, ___ + _____, ____, _____) : !(___ % __) ? _(__, ___ + _____, ___ % __, _____) : ((___ % __) == (___ / __) && !____) ? (printf("%dt", (___ / __)), _(__, ___ + _____, ____, _____)) : ((___ % __) > _____ && (___ % __) < (___ / __)) ? _(__, ___ + _____, ____, _____ + !((___ / __) % (___ % __))) : (___ < __ * __) ? _(__, ___ + _____, ____, _____) : 0;}int main(){ _(100, 0, 0, 1);}程序到這裡應該差不多了。
那麼恭喜你,你有了參加國際C語言亂碼大賽的潛質了!小編寄語以上程序親測可(zuo)行(si),充分體現了大(xiao)家(bian)寫代碼時的心情變化,如果親們有更好的加密源碼方法可留言交流喔,萬一作死被移入精選了呢?O(∩_∩)O哈哈~
PS:以上內容僅供娛樂哈,實際編程中還是鼓勵大家養成習慣,儘可能地規範,代碼的可讀性也很重要的喔~~加油。
推薦閱讀:
TAG:C編程語言 |