快捷搜索:

CTF中常见编码、代码混淆及加解密

CTF中常见编码、代码混淆及加解密

  文中所涉及的技术、思路和工具仅供以安全为目的的学习交流使用,任何人不得将其用于非法用途以及盈利等目的,否则后果自行承担!

  作为一名初入安全行业的小白,最近很幸运的旁听了一位大佬关于CTF中常见的编码以及如何加解密的知识讲课,感觉受益匪浅,今天把学习到的知识与大家一起分享、交流一下。

  其实刚开始我对编码与加密的概念区分的不是非常清楚,一度以为加密就是对信息进行编码,这是一种错误的观点。编码是将数据信息转化成一种固定格式的编码信息,而加密是为了保证信息传输的安全性,两者还是有区别的。接下来就给大家讲讲编码与加密、解密。

  编码是为了方便不同系统间的信息传输,将数据转化成固定格式的信息,通过编码可以得到原始信息。常见的编码我们都已经很熟悉了,比如ASCII编码、URL编码、HTML实体编码以及Base编码等。

  又叫百分号编码,是统一资源定位编码方式。URL 地址(常说网址) 规定了常用地数字,字母可以直接使用,另外一批作为特殊用户字符也可以直接用(/,:@等),剩下的其它所有字符必须通过%xx 编码处理。编码方法很简单,在该字节 ascii 码的的 16 进制字符前面加%. 如空格字符,ascii 码是 32,对应16 进制是’20′,那么 urlencode 编码结果是:%20。

  Base家族主要有Base16、Base32、Base64。Base64由大小写字母和数字,+/组成(=号用作填充字符),Base32则是只有大写字母和234567。其中Base64/32是网络上最常见的用于传输8Bit字节代码的编码方式之一。Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。例如,在Java Persistence系统Hibernate中,就采用了Base64来将一个较长的唯一标识符(一般为128-bit的UUID)编码为一个字符串,用作HTTP表单和HTTP GET URL中的参数。Base64编码保证了二进制数据的安全。

  摩尔斯电码(又译为摩斯密码,Morse code)是一种时通时断的信号代码,通过不同的排列顺序来表达不同的英文字母、数字和标点符号。是早期的数字化通信形式,但是它不同于现代只使用零和一两种状态的二进制代码,它的代码包括五种:点、划、点和划之间的停顿、每个字符之间短的停顿、每个词之间中等的停顿以及句子之间长的停顿。

  除此之外,常用的编码方式还有敲击码(Tap code)等。编码在电子计算机、电视、遥控和通讯等方面广泛使用常用asp代码大全图片下载网站安卓手机版。编码是信息从一种形式或格式转换为另一种形式的过程;解码,是编码的逆过程asp学习。

  代码混淆(Obfuscated code)亦称花指令,是将计算机程序的代码,转换成一种功能上等价,但是难于阅读和理解的形式的行为。代码混淆可以用于程序源代码,也可以用于程序编译而成的中间代码。执行代码混淆的程序被称作代码混淆器。目前已经存在许多种功能各异的代码混淆器。常用的代码混淆有jsfuck、brainfuck,Vbscript.encode加密等

  jsfuck源于一门编程语言brainfuck,其主要的思想就是只使用8种特定的符号来编写代码。而jsfuck也是沿用了这个思想,它可以让你只用 6 个字符`[ ]( ) ! + `来编写 JavaScript 程序。此外,JSFuck可用于绕过恶意代码检测,且可以被用于跨站脚本攻击。因为缺乏原生JavaScript应有的特征,类似JSFuck的JavaScript混淆技术可帮助恶意代码绕过入侵防御系统或内容过滤器。现实中,因为JSFuck中缺少字母数字字符,且eBay中的内容过滤器曾存在缺陷,使得卖家曾经可以在他们的eBay拍卖页面中嵌入任意JSFuck脚本

  Brainfuck是一种极小化的计算机语言,目标是建立一种简单的、可以用最小的编译器来实现的、符合图灵完全思想的编程语言。BrainFuck 语言只有八种符号,所有的操作都由这八种符号(`>

  jjencode 将 JS 代码转换成只有符号的字符串,类似于 rrencode,介绍的,aaencode 可以将 JS 代码转换成常用的网络表情,也就是我们说的颜文字 js 加密。

  密码学是研究编制密码和破译密码的技术科学。研究密码变化的客观规律,应用于编制密码以保守通信秘密的,称为编码学;应用于破译密码以获取通信情报的,称为破译学,总称密码学。主要分为古典加密算法和现代密码学。

  古典密码算法曾经被广泛应用,大都比较简单,使用手工和机械操作来实现加密和解密。它的主要对象是文字信息,利用密码算法实现文字信息的加密和解密。古典密码编码方法归根结底主要有两种,即置换和代换。比较经典的有凯撒密码、栅栏密码、培根密码、仿射密码和维吉尼亚密码等。

  是一种最简单且最广为人知的加密技术。它是一种替换加密的技术,明文中的所有字母按照按顺序进行 n 个字符错位转换后被替换成密文。

  又名倍康尼密码(英语:Bacon’s cipher)是由法兰西斯·培根发明的一种隐写术。是一种替换密码,每个明文字母被一个由5字符组成的序列替换。最初的加密方式就是由‘A’和’B组成序列替换明文

  仿射密码(Affine Cipher)是一种单表代换密码,字母表中的每个字母相应的值使用一个简单的数学函数映射到对应的数值,再把对应数值转换成字母。每一个字母都是通过函数(ax + b)mod m加密,其中B是位移量,为了保证仿射密码的可逆性,a和m需要满足gcd(a , m)=1,一般m为设置为26。

  维吉尼亚密码(又译维热纳尔密码)是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式。以其简单易用而著称,同时初学者通常难以破解,因而又被称为“不可破译的密码”。这也让很多人使用维吉尼亚密码来加密的目的就是为了将其破解。

  加密过程:如果第一行为明文字母,第一列为密钥字母,那么明文字母’T列和密钥字母’C行的交点就是密文字母’V,以此类推。

  现代密码学研究信息从发端到收端的安全传输和安全存储,核心是密码编码学和密码分析学。1949年香农发表《保密系统的通信理论》标志着现代密码学的真正开始(第一次质的飞跃)。1976年,Diffie和Hellman发表《密码学的新方向》,标志着公钥密码体制的诞生(第二次质的飞跃)。

  在对称加密算法中,数据发信方将原始数据和加密密钥一起经过特殊加密算法处理后,使其变成复杂的加密密文发送出去,收信方需要使用加密用过的密钥及相同算法的逆算法对密文进行解密,才能使其恢复成可读明文。在大多数的对称算法中,加密密钥和解密密钥是相同的,所以也称这种加密算法为秘密密钥算法或单密钥算法。它要求发送方和接收方在安全通信之前,商定一个密钥。对称算法的安全性依赖于密钥,泄漏密钥就意味着任何人都可以对他们发送或接收的消息解密,所以密钥的保密性对通信的安全性至关重要。特点是算法公开、计算量小、加密速度快、加密效率高。

  * 分组加密(通常也成为块加密)是将明文进行分组,加密算法对每个分组分别加密,通常明文分组和加密后得到的密文分组等长。典型的分组大小是64bit或128bit。如DES,3DES,AES。

  可直接音译为“哈希”,一般翻译为“散列”把任意长度的输入(又叫做预映射, pre-image),通过散列算法变换成固定长度的输出,该输出就是散列值。它是基于快速存取的角度设计的,也是一种典型的“空间换时间”的做法。顾名思义,该数据结构可以理解为一个线性表,但是其中的元素不是紧密排列的,而是可能存在空隙。

  常见HASH算法主要有MD5、SHA-1等。主要用于文件校验,数字签名,鉴权协议。另外这里还有一篇利用Hash碰撞而产生DOS攻击的案例,有兴趣的可以阅读一下:

  (其实把hash算法当成是一种加密算法,这是不准确的,我们知道加密总是相对于解密而言的,没有解密何谈加密呢,HASH的设计以无法解为目的的。并且如果我们不附加一个随机的salt值,HASH口令是很容易被字典攻击入侵的)

  RSA加密算法是一种非对称加密算法。在公开密钥加密和电子商业中RSA被广泛使用,是现今使用最广泛的公钥密码算法。和其它加密过程一样,对RSA来说分配公钥的过程是非常重要的。分配公钥的过程必须能够抵挡中间人攻击。假设Eve交给Bob一个公钥,并使Bob相信这是Alice的公钥,并且她可以截下Alice和Bob之间的信息传递,那么她可以将她自己的公钥传给Bob,Bob以为这是Alice的公钥。Eve可以将所有Bob传递给Alice的消息截下来,将这个消息用她自己的密钥解密,读这个消息,然后将这个消息再用Alice的公钥加密后传给Alice。理论上Alice和Bob都不会发现Eve在偷听他们的消息。今天人们一般用可靠的第三方机构签发证书来防止这样的攻击。根据密钥的使用方法,可以将密码分为对称密码和公钥密码。

  从通式可知,只要知道E和N任何人都可以进行RSA加密了,所以说E、N是RSA加密的密钥,即E和N的组合就是公钥,用(E,N)来表示公钥。

  • 如果n在768bit或者更高,可以尝试使用一些在线的n分解网站,这些网站会存储一些已经分解成功的n,比如:

  • 在p,q的取值差异过大,或者p,q的取值过于相近的时候,Format方法与Pollard rho方法都可以很快将n分解成功。此类分解方法有一个开源项目yafu将其自动化实现了,不论n的大小,只要p和q存在相差过大或者过近时,都可以通过yafu很快地分解成功。

  如果在RSA的使用中使用了相同的模n对相同的明文m进行了加密,那么就可以在不分解n的情况下还原出明文m的值。

您可能还会对下面的文章感兴趣: