首页 > 其他分享 >密码密码密码

密码密码密码

时间:2024-10-22 17:59:47浏览次数:4  
标签:v1 sum v0 密码 密钥 key uint32

参考文章(多数都是搬这个老登的): https://www.cnblogs.com/gaoyucan/p/17087521.html

流密码

常见的有 RC4、Salsa20 以及 ChaCha20.之前一直是识别加密算法,虽然只会识别一个rc4,遇到其他还是傻眼,一直没想到流密码的密文是仅由明文与密钥流异或得到的,以此识别出流密码后,动调获取密钥流或者将密文patch进去拿输出即可.(明明就在高神的流密码第一段,这么久了才发现)

RC4

/*初始化函数*/
void rc4_init(unsigned char *s, unsigned char *key, unsigned long Len) {
    int i = 0, j = 0;
    char k[256] = {0};
    unsigned char tmp = 0;
    for (i = 0; i < 256; i++) {
        s[i] = i;
        k[i] = key[i % Len];
    }
    for (i = 0; i < 256; i++) {
        j = (j + s[i] + k[i]) % 256;
        tmp = s[i];
        s[i] = s[j]; // 交换s[i]和s[j]
        s[j] = tmp;
    }
}

/*加解密*/
void rc4_crypt(unsigned char *s, unsigned char *Data, unsigned long Len) {
    int i = 0, j = 0, t = 0;
    unsigned long k = 0;
    unsigned char tmp;
    for (k = 0; k < Len; k++) {
        i = (i + 1) % 256;
        j = (j + s[i]) % 256;
        tmp = s[i];
        s[i] = s[j]; // 交换s[x]和s[y]
        s[j] = tmp;
        t = (s[i] + s[j]) % 256;
        Data[k] ^= s[t];
    }
}

Salsa20

遇到的话,有时间就补

ChaCha20

同上,暂时记一下例题[RCTF2022 checkserver],顺便附一个识别图,感觉好像见过
img

分组加密

Tea

#include 

void encrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0, i;               /* set up */
    uint32_t delta=0x9e3779b9;                         /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];       /* cache key */
    for (i=0; i < 32; i++) {                           /* basic cycle start */
        sum += delta;
        v0 += ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        v1 += ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);  
    }                                                  /* end cycle */
    v[0]=v0; v[1]=v1;
}

void decrypt (uint32_t* v, uint32_t* k) {
    uint32_t v0=v[0], v1=v[1], sum=0xC6EF3720, i;      /* set up */
    uint32_t delta=0x9e3779b9;                         /* a key schedule constant */
    uint32_t k0=k[0], k1=k[1], k2=k[2], k3=k[3];       /* cache key */
    for (i=0; i<32; i++) {                             /* basic cycle start */
        v1 -= ((v0<<4) + k2) ^ (v0 + sum) ^ ((v0>>5) + k3);
        v0 -= ((v1<<4) + k0) ^ (v1 + sum) ^ ((v1>>5) + k1);
        sum -= delta;
    }                                                  /* end cycle */
    v[0]=v0; v[1]=v1;
}

Tea类加密很好识别,delta=_0x9e3779b9会被魔改

XTea

#include 

/* take 64 bits of data in v[0] and v[1] and 128 bits of key[0] - key[3] */

void encipher(unsigned     int num_rounds, uint32_t v[2], uint32_t     const key[4]) {
    unsigned     int i;
    uint32_t v0=v[0], v1=v[1], sum=0, delta=0x9E3779B9;
    for (i=0; i < num_rounds; i++) {
        v0 += (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
        sum += delta;
        v1 += (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
    }
    v[0]=v0; v[1]=v1;
}

void decipher(unsigned int num_rounds, uint32_t v[2], uint32_t const key[4]) {
    unsigned int i;
    uint32_t v0=v[0], v1=v[1], delta=0x9E3779B9, sum=delta*num_rounds;
    for (i=0; i < num_rounds; i++) {
        v1 -= (((v0 << 4) ^ (v0 >> 5)) + v0) ^ (sum + key[(sum>>11) & 3]);
        sum -= delta;
        v0 -= (((v1 << 4) ^ (v1 >> 5)) + v1) ^ (sum + key[sum & 3]);
    }
    v[0]=v0; v[1]=v1;
}

与tea区别sum+=delta位置,key[(sum>>11) & 3]与key[sum & 3],其中detal会被魔改,移位数可能被魔改

XXTea

#define DELTA 0x9e3779b9
#define MX ((z>>5^y<<2) + (y>>3^z<<4) ^ (sum^y) + (k[p&3^e]^z)) 

long btea(long* v, long n, long* k) {
unsigned long z=v[n-1], y=v[0], sum=0, e;
long p, q ;
if (n > 1) {          /* Coding Part */
    q = 6 + 52/n;
    while (q-- > 0) {
    sum += DELTA;
    e = (sum >> 2) & 3;
    for (p=0; p<n-1; p++) y = v[p+1], z = v[p] += MX;
    y = v[0];
    z = v[n-1] += MX;
    }
    return 0 ; 
} else if (n < -1) {  /* Decoding Part */
    n = -n;
    q = 6 + 52/n;
    sum = q*DELTA ;
    while (sum != 0) {
    e = (sum >> 2) & 3;
    for (p=n-1; p>0; p--) z = v[p-1], y = v[p] -= MX;
    z = v[n-1];
    y = v[0] -= MX;
    sum -= DELTA;
    }
    return 0;
}
return 1;
}

一般来说,识别可以通过,delta 以及round = 6 + 52/n(sum >> 2) & 3这种特殊的运算来判断。

这里v指密文或者明文:n指round【len(flag)/4】正是加密,负是解密:k指密钥

魔改点:(1)(sum>> 2) & 3改为(sum >> 2)& 5 (2)delta值

DES

DES的密钥位64bit,但每个字节的第八位(最后一位)是奇偶校验位,所以有效密钥为56bit

主要通过 S盒 以及各个置乱表来识别,可以使用插件来自动化识别这些特征。

AES

AES(Advanced Encryption Standard,高级加密标准),分组大小为128位,根据密钥长度和轮数可以分为 AES-128、AES-192、AES-256,具体区别如下表:

AES-128 AES-192 AES-256
密钥长度 128 192 256
轮数 10 12 14

对于如何识别是哪一种,可能看密钥大小不好观察,可以选择看循环的次数
整体流程
整体来说AES加密有如下几步

  1. 密钥拓展,使用密钥拓展算法通过初始密钥获取轮密钥
    • AES使用一个密钥扩展算法将原始密钥生成多个轮密钥(Round Keys),这些轮密钥在后续的加密轮次中使用。对于128位密钥,会生成10轮密钥
  2. 初始轮密钥加
    • 将明文数据(明文)与第一个轮密钥进行异或(XOR)运算,得到初始状态。
  3. 主加密轮
    • S盒替换(SubBytes)
    • 行移位(ShiftRows)
    • 列混合(MixColumns)
    • 轮密钥加(AddRoundKey)
  4. 最后一轮(与主加密轮类似,但省略列混合)
    • S盒替换(SubBytes)
    • 行移位(ShiftRows)
    • 轮密钥加(AddRoundKey)

魔改

  1. 在某一步实现的函数里面加一个可逆的运算(一般是异或).
  2. 将行移位与列混合的顺序调换一下.
  3. S盒代换中将S盒修改一下
  4. 密钥拓展被修改,不进行分析哪里修改,直接动调将生成的轮密钥dump下来,之后对着源码,将密钥拓展函数(static void KeyExpansion())过程注释,将dump下来的轮密钥直接赋值给RoundKey

基础知识

IV

  1. 作用
    • 防止相同的明文产生相同的密文
    • 增强安全性: IV能有效防止重放攻击(patch密文)和某些模式下的分析攻击,特别是在某些分组加密模式(如CBC模式)中,IV的引入可以避免加密块之间存在的相似性,从而进一步提升加密强度。
  2. 本质:
    • IV是加密算法中用来引入随机性或不可预测性的一个输入值,其本身并不需要保密,但它必须是唯一且随机生成的,至少对每次加密来说不能重复使用。IV本质上与密钥不同,密钥是保持加密解密过程的机密性,而IV只是引入随机性的手段。(但是对于真正做逆向的时候会是什么情况,下次遇到仔细分析)

分组大小

  • 分组大小指的是加密算法处理的固定数据块的大小(例如AES分组大小为128bit)
    • 在每次加密/解密时,AES会将输入的数据分成若干个128bit的数据块
    • 如果输入的数据长度超过128位,AES会将数据分块处理.如果数据不足128位,通常会进行填充(padding)以凑满128位。
    • 例如
      • 如果明文数据为64字节(512bit),AES将这64字节的数据分为四个128位的分组,逐一进行加解密
      • 如果明文数据不是128位的整数倍(比如输入是150位的明文),就会使用填充算法来凑齐到128位的倍数。

注意

  1. 在遇到移位操作时,ida识为什么类型int or uint,再解密时便使用什么类型,如果int型密文报错便(int)强转一下

标签:v1,sum,v0,密码,密钥,key,uint32
From: https://www.cnblogs.com/Un1corn/p/18400944

相关文章

  • 怎么给docker的redis设置密码
    怎么给docker的redis设置密码设置密码方式1:启动容器时设置dockerrun-itd--nameredis-v1-p6379:6379redis--requirepass123456说明:--name(启动容器的名称)-p宿主机映射端口:容器里的redis启动端口--requirepass启动密码设置密码方式2:修改配置文件1.......
  • 修改密码和注销账户的实现
    在了解程序框架后,我决定创建新的JSP页面,以实现修改账户密码和注销账户的功能。这一过程不仅涉及到前端页面的设计,还需要与数据库建立有效的连接,以确保操作的顺利进行。1.功能需求首先,针对用户账户的管理,需要实现以下功能:修改账户密码:用户能够安全地更新其账户密码。注销账......
  • 批量自动分发Linux密码
    2.批量自动分发密钥(完整版)#本shell脚本是基于DSA加密方式进行加密的,测试的环境为centOS7.5,若要使用别的加密方式,请修改源代码,此脚本可以自动发现IP地址,并分发分发,同一网段的IP地址,目前还不可以分发多网段的IP地址。#可以实现SSH密钥基于DSA方式密钥的分发及创建新密钥并进行分......
  • PbootCMS忘记登录密码怎么办?忘记了PBootCMS后台的登录密码
    问题描述:忘记了PBootCMS后台的登录密码。解决方案:通过数据库直接修改密码:登录数据库管理工具(如phpMyAdmin)。选择PBootCMS数据库。找到用户表,通常表名为pboot_admin或类似的名称。定位到你的用户记录,通常用户名为admin。修改密码字段:生成MD5哈希值:使用在线MD5生成工具......
  • 玛雅人的密码
    玛雅人有一种密码,如果字符串中出现连续的 20122012 四个数字就能解开密码。给定一个长度为 NN 的字符串,该字符串中只含有 0,1,20,1,2 三种数字。可以对该字符串进行换位操作,每次操作可选取相邻的两个数字交换彼此位置。请问这个字符串要换位几次才能解开密码。例如 ......
  • 在运维领域,为什么以文件形式存储密码比环境变量存储密码要更安全?
    dockercomposesecretshttps://docs.docker.com/compose/how-tos/use-secrets/Asecretisanypieceofdata,suchasapassword,certificate,orAPIkey,thatshouldn’tbetransmittedoveranetworkorstoredunencryptedinaDockerfileorinyourapplicat......
  • 如何网站后台登录?登录 地址?账号密码
    网站后台登录的具体步骤和信息可能会因不同的网站而有所不同,但通常遵循以下通用流程:1.找到后台登录地址常见路径:大多数网站的后台登录地址通常是在主域名后面加上特定的路径,例如:https://www.example.com/adminhttps://www.example.com/backendhttps://admin.example.com......
  • pbootcms使用阿里云主机 后台账号密码都正确 但是登录不进去
    问题描述:阿里云主机新增了文件(夹)数量的限制,即使磁盘空间充足,但文件(夹)数量达到上限后,PBootCMS的缓存文件无法正常更新,导致网站后台无法登录。解决方法:清理缓存文件:登录到服务器,找到PBootCMS的缓存目录(通常位于 /data/runtime/cache 或类似路径)。删除不必要的缓存文件,......
  • pbootcms默认后台地址账号和密码是什么?
    为了确保PBootCMS网站的安全性,建议在部署到服务器后尽快修改后台地址和密码。以下是具体的步骤:修改后台地址登录PBootCMS后台:使用默认的后台地址 http://www.xxxxxx.com/admin.php 登录后台。默认账号:admin默认密码:123456 或 admin导航到后台设置:登录后台后......
  • playfair密码
    实验介绍:playfair密码也是多表代换密码一:编制密码表playfair密码表是一个5x5的矩阵密码表包括了所有26个字母5x5等于25,那么多出的一个字母怎么办呢?在规定中,字母i和j放入同一个格子从左到右,从上到下把密钥填入矩阵,再按字母表顺序填入字母矩阵已经有的字母不填入二:格式化......