一、加密算法
加密算法是用于保护信息安全、确保数据机密性、完整性和可用性的重要技术手段。以下是对常见加密算法的分析:
1.对称加密算法:
- DES(Data Encryption Standard):曾经是广泛使用的对称加密算法,但由于密钥长度较短(56 位),安全性相对较低,已逐渐被更安全的算法取代。
- 3DES:是 DES 的改进版本,通过对数据进行三次 DES 加密来提高安全性。
- AES(Advanced Encryption Standard):目前应用最广泛的对称加密算法之一,密钥长度可选择 128 位、192 位或 256 位,安全性高,加密和解密效率也较高。
2.非对称加密算法:
- RSA:基于大整数分解的困难性,常用于数字签名和密钥交换。其安全性依赖于大数的因式分解,但随着计算能力的提高,需要不断增加密钥长度来保证安全性。
- ECC(Elliptic Curve Cryptography):基于椭圆曲线数学,在相同的安全级别下,ECC 的密钥长度比 RSA 短,计算效率更高,适用于资源受限的设备。
3.哈希算法:
- MD5(Message Digest Algorithm 5):生成 128 位的哈希值,但由于其存在安全漏洞,现已不建议用于重要场景。
- SHA-1(Secure Hash Algorithm 1):也存在一定的安全风险,逐渐被 SHA-2 和 SHA-3 系列取代。
- SHA-2:包括 SHA-224、SHA-256、SHA-384 和 SHA-512 等变体,安全性更高。
- SHA-3:新一代的哈希算法,具有更好的安全性和抗碰撞性。
4.加密算法的选择:
在实际应用中,选择加密算法需要考虑多个因素,如安全性需求、计算资源、性能要求等。对于一般的数据加密传输,AES 通常是一个较好的选择;对于数字签名和密钥交换,RSA 或 ECC 较为常见;而在验证数据完整性时,哈希算法如 SHA-256 等经常被使用。
5.Base64:是一种基于 64 个可打印字符来表示二进制数据的编码方式,严格来说它不是一种加密算法,而是一种编码算法。
6.在线工具:
https://jsfuck.com/
https://cmd5.com/
https://www.uutils.com/
https://shell.virbox.com/
http://tool.chacuo.net/cryptdes
7.PHP加密举例
PHP在线运行:https://www.bejson.com/runcode/php/
<?php
//aes
namespace vendor;
class EncryptionTool{
public static function enAES($originTxt, $key): string{
return base64_encode(openssl_encrypt($originTxt, 'AES-128-ECB',$key, OPENSSL_RAW_DATA));
}
public static function deAES($originTxt, $key): string{
$data = base64_decode($originTxt);
return openssl_decrypt($data,'AES-128-ECB',$key, OPENSSL_RAW_DATA);
}
}
//des
class DES
{
/**
* @var string $method 加解密方法,可通过 openssl_get_cipher_methods() 获得
*/
protected $method;
/**
* @var string $key 加解密的密钥
*/
protected $key;
/**
* @var string $output 输出格式 无、base64、hex
*/
protected $output;
/**
* @var string $iv 加解密的向量
*/
protected $iv;
/**
* @var string $options
*/
protected $options;
// output 的类型
const OUTPUT_NULL = '';
const OUTPUT_BASE64 = 'base64';
const OUTPUT_HEX = 'hex';
/**
* DES constructor.
* @param string $key
* @param string $method
* ECB DES-ECB、DES-EDE3 (为 ECB 模式时,$iv 为空即可)
* CBC DES-CBC、DES-EDE3-CBC、DESX-CBC
* CFB DES-CFB8、DES-EDE3-CFB8
* CTR
* OFB
*
* @param string $output
* base64、hex
*
* @param string $iv
* @param int $options
*/
public function __construct($key, $method = 'DES-ECB', $output = '', $iv = '', $options = OPENSSL_RAW_DATA | OPENSSL_NO_PADDING)
{
$this->key = $key;
$this->method = $method;
$this->output = $output;
$this->iv = $iv;
$this->options = $options;
}
/**
* 加密
*
* @param $str
* @return string
*/
public function encrypt($str)
{
$str = $this->pkcsPadding($str, 8);
$sign = openssl_encrypt($str, $this->method, $this->key, $this->options, $this->iv);
if ($this->output == self::OUTPUT_BASE64) {
$sign = base64_encode($sign);
} else if ($this->output == self::OUTPUT_HEX) {
$sign = bin2hex($sign);
}
return $sign;
}
/**
* 解密
*
* @param $encrypted
* @return string
*/
public function decrypt($encrypted)
{
if ($this->output == self::OUTPUT_BASE64) {
$encrypted = base64_decode($encrypted);
} else if ($this->output == self::OUTPUT_HEX) {
$encrypted = hex2bin($encrypted);
}
$sign = @openssl_decrypt($encrypted, $this->method, $this->key, $this->options, $this->iv);
$sign = $this->unPkcsPadding($sign);
$sign = rtrim($sign);
return $sign;
}
/**
* 填充
*
* @param $str
* @param $blocksize
* @return string
*/
private function pkcsPadding($str, $blocksize)
{
$pad = $blocksize - (strlen($str) % $blocksize);
return $str . str_repeat(chr($pad), $pad);
}
/**
* 去填充
*
* @param $str
* @return string
*/
private function unPkcsPadding($str)
{
$pad = ord($str{strlen($str) - 1});
if ($pad > strlen($str)) {
return false;
}
return substr($str, 0, -1 * $pad);
}
}
//RSA
define('RSA_PUBLIC', '-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCmkANmC849IOntYQQdSgLvMMGm
8V/u838ATHaoZwvweoYyd+/7Wx+bx5bdktJb46YbqS1vz3VRdXsyJIWhpNcmtKhY
inwcl83aLtzJeKsznppqMyAIseaKIeAm6tT8uttNkr2zOymL/PbMpByTQeEFlyy1
poLBwrol0F4USc+owwIDAQAB
-----END PUBLIC KEY-----');
define('RSA_PRIVATE','-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKaQA2YLzj0g6e1h
BB1KAu8wwabxX+7zfwBMdqhnC/B6hjJ37/tbH5vHlt2S0lvjphupLW/PdVF1ezIk
haGk1ya0qFiKfByXzdou3Ml4qzOemmozIAix5ooh4Cbq1Py6202SvbM7KYv89syk
HJNB4QWXLLWmgsHCuiXQXhRJz6jDAgMBAAECgYAIF5cSriAm+CJlVgFNKvtZg5Tk
93UhttLEwPJC3D7IQCuk6A7Qt2yhtOCvgyKVNEotrdp3RCz++CY0GXIkmE2bj7i0
fv5vT3kWvO9nImGhTBH6QlFDxc9+p3ukwsonnCshkSV9gmH5NB/yFoH1m8tck2Gm
BXDj+bBGUoKGWtQ7gQJBANR/jd5ZKf6unLsgpFUS/kNBgUa+EhVg2tfr9OMioWDv
MSqzG/sARQ2AbO00ytpkbAKxxKkObPYsn47MWsf5970CQQDIqRiGmCY5QDAaejW4
HbOcsSovoxTqu1scGc3Qd6GYvLHujKDoubZdXCVOYQUMEnCD5j7kdNxPbVzdzXll
9+p/AkEAu/34iXwCbgEWQWp4V5dNAD0kXGxs3SLpmNpztLn/YR1bNvZry5wKew5h
z1zEFX+AGsYgQJu1g/goVJGvwnj/VQJAOe6f9xPsTTEb8jkAU2S323BG1rQFsPNg
jY9hnWM8k2U/FbkiJ66eWPvmhWd7Vo3oUBxkYf7fMEtJuXu+JdNarwJAAwJK0YmO
LxP4U+gTrj7y/j/feArDqBukSngcDFnAKu1hsc68FJ/vT5iOC6S7YpRJkp8egj5o
pCcWaTO3GgC5Kg==
-----END PRIVATE KEY-----');
$password='xiaodisec';
//md5
echo "原始数据:$password". "<br/>";
echo "MD5加密后:".md5($password). "<hr/>";
//base64
echo "原始数据:$password". "<br/>";
echo "BASE64编码后:".base64_encode($password). "<hr/>";
//aes
echo "原始数据: " . $password . "<br/>";
$data = EncryptionTool::enAES($password, "1234567891234567");
echo "AES加密后: " . $data . "<hr/>";
//echo "解密后: " . EncryptionTool::deAES($data, "1234567891234567") . "<br/>";
//des
echo "原始数据:$password". "<br/>";
$key = 'key123456';
$iv = 'iv123456';
// DES CBC 加解密
echo 'DES CBC 加解密:';
$des = new DES($key, 'DES-CBC', DES::OUTPUT_BASE64, $iv);
echo $base64Sign = $des->encrypt($password);
echo "<br>";
//echo $des->decrypt($base64Sign);
echo "<hr>";
// DES ECB 加解密
echo "原始数据:$password". "<br/>";
echo 'DES ECB 加解密:';
$des = new DES($key, 'DES-ECB', DES::OUTPUT_BASE64);
echo $base64Sign = $des->encrypt($password);
echo "<hr>";
//echo $des->decrypt($base64Sign);
//rsa
//公钥加密
$public_key = openssl_pkey_get_public(RSA_PUBLIC);
if(!$public_key){
die('公钥不可用');
}
//第一个参数是待加密的数据只能是string,第二个参数是加密后的数据,第三个参数是openssl_pkey_get_public返回的资源类型,第四个参数是填充方式
$return_en = openssl_public_encrypt($password, $crypted, $public_key);
if(!$return_en){
return('加密失败,请检查RSA秘钥');
}
$eb64_cry = base64_encode($crypted);
echo "RSA公钥加密数据:".$eb64_cry;
echo "<br>";
//私钥解密
$private_key = openssl_pkey_get_private(RSA_PRIVATE);
if(!$private_key){
die('私钥不可用');
}
$return_de = openssl_private_decrypt(base64_decode($eb64_cry), $decrypted, $private_key);
if(!$return_de){
return('解密失败,请检查RSA秘钥');
}
echo "RSA私钥解密数据:".$decrypted;
echo "<hr>";
//私钥加密
$private_key = openssl_pkey_get_private(RSA_PRIVATE);
if(!$private_key){
die('私钥不可用');
}
$return_en = openssl_private_encrypt($password, $crypted, $private_key);
if(!$return_en){
return('加密失败,请检查RSA秘钥');
}
$eb64_cry = base64_encode($crypted);
echo "RSA私钥加密数据".$eb64_cry;
echo "<br>";
//公钥解密
$public_key = openssl_pkey_get_public(RSA_PUBLIC);
if(!$public_key){
die('公钥不可用');
}
$return_de = openssl_public_decrypt(base64_decode($eb64_cry), $decrypted, $public_key);
if(!$return_de){
return('解密失败,请检查RSA秘钥');
}
echo "RSA公钥解密数据:".$decrypted;
echo "<hr>";
?>
8.解密工具:
二、传输加密
传输加密是为了保障数据在网络传输过程中的安全性和保密性而采取的技术手段。
重要性:
在网络通信中,数据可能会经过多个节点和不同的网络环境,如果不进行加密,数据很容易被窃取、篡改或监听。
常见的传输加密协议:
- SSL(Secure Sockets Layer):早期的加密协议,但由于存在一些安全漏洞,已逐渐被 TLS 取代。
- TLS(Transport Layer Security):是 SSL 的继任者,提供更强大的加密和认证功能。TLS 工作在传输层,对应用层协议(如 HTTP、FTP 等)提供透明的加密服务。
- 应用场景:在 HTTPS 中,浏览器和服务器之间通过 TLS 协议建立安全连接,保证网页内容的安全传输。
加密方式:
- 对称加密:通信双方使用相同的密钥进行加密和解密,速度快但密钥管理复杂。
- 非对称加密:使用公钥和私钥对,公钥用于加密,私钥用于解密。常用于密钥交换。
工作流程(以 TLS 为例):
- 客户端向服务器发起连接请求。
- 服务器向客户端发送其数字证书,包含公钥等信息。
- 客户端验证证书的合法性。
- 客户端生成对称密钥,用服务器的公钥加密后发送给服务器。
- 服务器用私钥解密得到对称密钥。
- 后续通信双方使用对称密钥进行加密传输数据。
数据格式:XML、JSON
NTLM
三、逆向保护
逆向保护是指采取一系列技术和措施来防止软件、硬件或其他数字产品被逆向工程分析、破解、复制或篡改。
目的:
- 保护知识产权:防止他人未经授权获取产品的核心技术、算法或设计思路。
- 维护商业利益:避免竞争对手复制产品,保障市场份额和利润。
常见的逆向保护技术:
- 代码混淆:通过改变代码的结构、变量名、函数名等,使代码难以理解和分析。
- 加密:对关键数据、算法或代码进行加密,只有在运行时解密。
- 反调试:检测并阻止调试工具对程序的调试,增加分析难度。
- 软件水印:在软件中嵌入特定的标识或信息,用于证明版权和追踪来源。
硬件方面的逆向保护:
- 芯片加密:对硬件芯片中的关键信息进行加密存储。
- 防篡改封装:采用特殊的封装技术,防止对硬件的物理篡改。
MD5加盐值解密思路
<?php
$pass='123456';
$salt='3946d5';
$a=md5($pass);
$aa=$a.$salt;
$aaa=md5($aa);
if($aaa=='d7192407bb4bfc83d28f374b6812fbcd'){
echo 'ok';
}else{
echo 'no';
}
?>
Discuz解密:
password_hash
password_verify
<?php
// 想知道以下字符从哪里来,可参见 password_hash() 的例子
$hash = '$2y$07$BCryptRequires22Chrcte/VlQH0piJtjXl.0t1XkA8pw9dMXTpOq';
if (password_verify('rasmuslerdorf', $hash)) {
echo 'Password is valid!';
} else {
echo 'Invalid password.';
}
?>