📄 da.c
字号:
//EMV LEVEL 2 Data Authority file
//Create by cihuyf
//2003.12.25
#include <string.h>
#include <stdlib.h>
#include "../inc/posapi.h"
#include "../inc/posdef.h"
#include "../inc/pos810.h"
#include "../inc/eglobal.h"
#include "../inc/posfunc.h"
#include "../inc/gnn.h"
#include "../inc/nn.h"
#include "../inc/digit.h"
//unsigned char ipkc1[96]={0x24,0x0E,0x0E,0xA6,0xD2,0x1E,0x65,0x52,0xB2,0xED,0x3F,0xAD,0xC2,0xF1,0xD2,0x80,0xD1,0xAD,0x91,0x3E,0x62,0x2E,0x2C,0x35,0x21,0xAA,0xDF,0x2A,0x47,0xB3,0xAC,0xF6,0x6B,0x67,0x1D,0x4B,0x12,0x36,0x81,0x9A,0xD1,0xB1,0xFA,0x9F,0xA6,0xAC,0xDE,0x38,0x66,0x5B,0x6B,0xDE,0x53,0xC3,0x80,0xA1,0x53,0x16,0x9A,0xBA,0xAB,0x94,0x83,0x90,0x2F,0xB7,0x63,0xE9,0xEA,0xA7,0xAB,0x27,0x8A,0x5D,0x39,0xD3,0xA5,0x0E,0x15,0x98,0xB8,0x4C,0x22,0x13,0x9D,0x43,0xA7,0x48,0x6F,0x71,0xAA,0x0E,0xC3,0x90,0x2D,0x26};
//unsigned char capk1[96]={0xAF,0x07,0x54,0xEA,0xED,0x97,0x70,0x43,0xAB,0x6F,0x41,0xD6,0x31,0x2A,0xB1,0xE2,0x2A,0x68,0x09,0x17,0x5B,0xEB,0x28,0xE7,0x0D,0x5F,0x99,0xB2,0xDF,0x18,0xCA,0xE7,0x35,0x19,0x34,0x1B,0xBB,0xD3,0x27,0xD0,0xB8,0xBE,0x9D,0x4D,0x0E,0x15,0xF0,0x7D,0x36,0xEA,0x3E,0x3A,0x05,0xC8,0x92,0xF5,0xB1,0x9A,0x3E,0x9D,0x34,0x13,0xB0,0xD9,0x7E,0x7A,0xD1,0x0A,0x5F,0x5D,0xE8,0xE3,0x88,0x60,0xC0,0xAD,0x00,0x4B,0x1E,0x06,0xF4,0x04,0x0C,0x29,0x5A,0xCB,0x45,0x7A,0x78,0x85,0x51,0xB6,0x12,0x7C,0x0B,0x29};
//unsigned char ipkc1[8]={0x6F,0x71,0xAA,0x0E,0xC3,0x90,0x2D,0x26};
//unsigned char capk1[8]={0x78,0x85,0x51,0xB6,0x12,0x7C,0x0B,0x29};
//NN_DIGIT IPKC1[24]={0xA60E0E24,0x52651ED2,0xAD3FEDB2,0x80D2F1C2,0x3E91ADD1,0x352C2E62,0x2ADFAA21,0xF6ACB347,0x4B1D676B,0x9A813612,0x9FFAB1D1,0x38DEACA6,0xDE6B5B66,0xA180C353,0xBA9A1653,0x908394AB,0xE963B72F,0x27ABA7EA,0xD3395D8A,0x98150EA5,0x13224CB8,0x48A7439D,0x0EAA716F,0x262D90C3};
//NN_DIGIT CAPK1[24]={0xEA5407AF,0x437097ED,0xD6416FAB,0xE2B12A31,0x1709682A,0xE728EB5B,0xB2995F0D,0xE7CA18DF,0x1B341935,0xD027D3BB,0x4D9DBEB8,0x7DF0150E,0x3A3EEA36,0xF592C805,0x9D3E9AB1,0xD9B01334,0x0AD17A7E,0xE3E85D5F,0xADC06088,0x061E4B00,0x290C04F4,0x7A45CB5A,0xB6518578,0x290B7C12};
extern unsigned char ipkc1[96];
void init_capk()
{
int i;
for(i=0;i<10;i++)
{
T_capk[i].index=0x00;
memset(T_capk[i].value,0,sizeof(T_capk[i].value));
T_capk[i].length=0x00;
memcpy(T_capk[i].exponent,"\x00\x00\x03",3);
memset(T_capk[i].hash,0,sizeof(T_capk[i].hash));
}
//index 90
T_capk[0].index=0x90;
memcpy(T_capk[0].value,"\xC2\x6B\x3C\xB3\x83\x3E\x42\xD8\x27\x0D\xC1\x0C\x89\x99\xB2\xDA\x18\x10\x68\x38\x65\x0D\xA0\xDB\xF1\x54\xEF\xD5\x11\x00\xAD\x14\x47\x41\xB2\xA8\x7D\x68\x81\xF8\x63\x0E\x33\x48\xDE\xA3\xF7\x80\x38\xE9\xB2\x1A\x69\x7E\xB2\xA6\x71\x6D\x32\xCB\xF2\x60\x86\xF1",0x40);
T_capk[0].length=0x40;
//index 95
T_capk[1].index=0x95;
memcpy(T_capk[1].value,"\xBE\x9E\x1F\xA5\xE9\xA8\x03\x85\x29\x99\xC4\xAB\x43\x2D\xB2\x86\x00\xDC\xD9\xDA\xB7\x6D\xFA\xAA\x47\x35\x5A\x0F\xE3\x7B\x15\x08\xAC\x6B\xF3\x88\x60\xD3\xC6\xC2\xE5\xB1\x2A\x3C\xAA\xF2\xA7\x00\x5A\x72\x41\xEB\xAA\x77\x71\x11\x2C\x74\xCF\x9A\x06\x34\x65\x2F\xBC\xA0\xE5\x98\x0C\x54\xA6\x47\x61\xEA\x10\x1A\x11\x4E\x0F\x0B\x55\x72\xAD\xD5\x7D\x01\x0B\x7C\x9C\x88\x7E\x10\x4C\xA4\xEE\x12\x72\xDA\x66\xD9\x97\xB9\xA9\x0B\x5A\x6D\x62\x4A\xB6\xC5\x7E\x73\xC8\xF9\x19\x00\x0E\xB5\xF6\x84\x89\x8E\xF8\xC3\xDB\xEF\xB3\x30\xC6\x26\x60\xBE\xD8\x8E\xA7\x8E\x90\x9A\xFF\x05\xF6\xDA\x62\x7B",0x90);
T_capk[1].length=0x90;
//index 96
T_capk[2].index=0x96;
memcpy(T_capk[2].value,"\xB7\x45\x86\xD1\x9A\x20\x7B\xE6\x62\x7C\x5B\x0A\xAF\xBC\x44\xA2\xEC\xF5\xA2\x94\x2D\x3A\x26\xCE\x19\xC4\xFF\xAE\xEE\x92\x05\x21\x86\x89\x22\xE8\x93\xE7\x83\x82\x25\xA3\x94\x7A\x26\x14\x79\x6F\xB2\xC0\x62\x8C\xE8\xC1\x1E\x38\x25\xA5\x6D\x3B\x1B\xBA\xEF\x78\x3A\x5C\x6A\x81\xF3\x6F\x86\x25\x39\x51\x26\xFA\x98\x3C\x52\x16\xD3\x16\x6D\x48\xAC\xDE\x8A\x43\x12\x12\xFF\x76\x3A\x7F\x79\xD9\xED\xB7\xFE\xD7\x6B\x48\x5D\xE4\x5B\xEB\x82\x9A\x3D\x47\x30\x84\x8A\x36\x6D\x33\x24\xC3\x02\x70\x32\xFF\x8D\x16\xA1\xE4\x4D\x8D",0x80);
T_capk[2].length=0x80;
//index 97
T_capk[3].index=0x97;
memcpy(T_capk[3].value,"\xAF\x07\x54\xEA\xED\x97\x70\x43\xAB\x6F\x41\xD6\x31\x2A\xB1\xE2\x2A\x68\x09\x17\x5B\xEB\x28\xE7\x0D\x5F\x99\xB2\xDF\x18\xCA\xE7\x35\x19\x34\x1B\xBB\xD3\x27\xD0\xB8\xBE\x9D\x4D\x0E\x15\xF0\x7D\x36\xEA\x3E\x3A\x05\xC8\x92\xF5\xB1\x9A\x3E\x9D\x34\x13\xB0\xD9\x7E\x7A\xD1\x0A\x5F\x5D\xE8\xE3\x88\x60\xC0\xAD\x00\x4B\x1E\x06\xF4\x04\x0C\x29\x5A\xCB\x45\x7A\x78\x85\x51\xB6\x12\x7C\x0B\x29",0x60);
T_capk[3].length=0x60;
//index 98
T_capk[4].index=0x98;
memcpy(T_capk[4].value,"\xCA\x02\x6E\x52\xA6\x95\xE7\x2B\xD3\x0A\xF9\x28\x19\x6E\xED\xC9\xFA\xF4\xA6\x19\xF2\x49\x2E\x3F\xB3\x11\x69\x78\x9C\x27\x6F\xFB\xB7\xD4\x31\x16\x64\x7B\xA9\xE0\xD1\x06\xA3\x54\x2E\x39\x65\x29\x2C\xF7\x78\x23\xDD\x34\xCA\x8E\xEC\x7D\xE3\x67\xE0\x80\x70\x89\x50\x77\xC7\xEF\xAD\x93\x99\x24\xCB\x18\x70\x67\xDB\xF9\x2C\xB1\xE7\x85\x91\x7B\xD3\x8B\xAC\xE0\xC1\x94\xCA\x12\xDF\x0C\xE5\xB7\xA5\x02\x75\xAC\x61\xBE\x7C\x3B\x43\x68\x87\xCA\x98\xC9\xFD\x39",0x70);
T_capk[4].length=0x70;
//index 99
T_capk[5].index=0x99;
memcpy(T_capk[5].value,"\xAB\x79\xFC\xC9\x52\x08\x96\x96\x7E\x77\x6E\x64\x44\x4E\x5D\xCD\xD6\xE1\x36\x11\x87\x4F\x39\x85\x72\x25\x20\x42\x52\x95\xEE\xA4\xBD\x0C\x27\x81\xDE\x7F\x31\xCD\x3D\x04\x1F\x56\x5F\x74\x73\x06\xEE\xD6\x29\x54\xB1\x7E\xDA\xBA\x3A\x6C\x5B\x85\xA1\xDE\x1B\xEB\x9A\x34\x14\x1A\xF3\x8F\xCF\x82\x79\xC9\xDE\xA0\xD5\xA6\x71\x0D\x08\xDB\x41\x24\xF0\x41\x94\x55\x87\xE2\x03\x59\xBA\xB4\x7B\x75\x75\xAD\x94\x26\x2D\x4B\x25\xF2\x64\xAF\x33\xDE\xDC\xF2\x8E\x09\x61\x5E\x93\x7D\xE3\x2E\xDC\x03\xC5\x44\x45\xFE\x7E\x38\x27\x77",0x80);
T_capk[5].length=0x80;
//index 03
T_capk[6].index=0x03;
memcpy(T_capk[6].value,"\xB3\xE5\xE6\x67\x50\x6C\x47\xCA\xAF\xB1\x2A\x26\x33\x81\x93\x50\x84\x66\x97\xDD\x65\xA7\x96\xE5\xCE\x77\xC5\x7C\x62\x6A\x66\xF7\x0B\xB6\x30\x91\x16\x12\xAD\x28\x32\x90\x9B\x80\x62\x29\x1B\xEC\xA4\x6C\xD3\x3B\x66\xA6\xF9\xC9\xD4\x8C\xED\x8B\x4F\xC8\x56\x1C\x8A\x1D\x8F\xB1\x58\x62\xC9\xEB\x60\x17\x8D\xEA\x2B\xE1\xF8\x22\x36\xFF\xCF\xF4\xF3\x84\x3C\x27\x21\x79\xDC\xDD\x38\x4D\x54\x10\x53\xDA\x6A\x6A\x0D\x3C\xE4\x8F\xDC\x2D\xC4\xE3\xE0\xEE\xE1\x5F",0x70);
T_capk[6].length=0x70;
memcpy(T_capk[6].hash,"\xFE\x70\xAB\x3B\x4D\x5A\x1B\x99\x24\x22\x8A\xDF\x80\x27\xC7\x58\x48\x3A\x8B\x7E",20);
//index 01
T_capk[7].index=0x01;
memcpy(T_capk[7].value,"\xC6\x96\x03\x42\x13\xD7\xD8\x54\x69\x84\x57\x9D\x1D\x0F\x0E\xA5\x19\xCF\xF8\xDE\xFF\xC4\x29\x35\x4C\xF3\xA8\x71\xA6\xF7\x18\x3F\x12\x28\xDA\x5C\x74\x70\xC0\x55\x38\x71\x00\xCB\x93\x5A\x71\x2C\x4E\x28\x64\xDF\x5D\x64\xBA\x93\xFE\x7E\x63\xE7\x1F\x25\xB1\xE5\xF5\x29\x85\x75\xEB\xE1\xC6\x3A\xA6\x17\x70\x69\x17\x91\x1D\xC2\xA7\x5A\xC2\x8B\x25\x1C\x7E\xF4\x0F\x23\x65\x91\x24\x90\xB9\x39\xBC\xA2\x12\x4A\x30\xA2\x8F\x54\x40\x2C\x34\xAE\xCA\x33\x1A\xB6\x7E\x1E\x79\xB2\x85\xDD\x57\x71\xB5\xD9\xFF\x79\xEA\x63\x0B\x75",0x80);
T_capk[7].length=0x80;
memcpy(T_capk[7].hash,"\xD3\x4A\x6A\x77\x60\x11\xC7\xE7\xCE\x3A\xEC\x5F\x03\xAD\x2F\x8C\xFC\x55\x03\xCC",20);
//index 07
T_capk[8].index=0x07;
memcpy(T_capk[8].value,"\xA8\x9F\x25\xA5\x6F\xA6\xDA\x25\x8C\x8C\xA8\xB4\x04\x27\xD9\x27\xB4\xA1\xEB\x4D\x7E\xA3\x26\xBB\xB1\x2F\x97\xDE\xD7\x0A\xE5\xE4\x48\x0F\xC9\xC5\xE8\xA9\x72\x17\x71\x10\xA1\xCC\x31\x8D\x06\xD2\xF8\xF5\xC4\x84\x4A\xC5\xFA\x79\xA4\xDC\x47\x0B\xB1\x1E\xD6\x35\x69\x9C\x17\x08\x1B\x90\xF1\xB9\x84\xF1\x2E\x92\xC1\xC5\x29\x27\x6D\x8A\xF8\xEC\x7F\x28\x49\x20\x97\xD8\xCD\x5B\xEC\xEA\x16\xFE\x40\x88\xF6\xCF\xAB\x4A\x1B\x42\x32\x8A\x1B\x99\x6F\x92\x78\xB0\xB7\xE3\x31\x1C\xA5\xEF\x85\x6C\x2F\x88\x84\x74\xB8\x36\x12\xA8\x2E\x4E\x00\xD0\xCD\x40\x69\xA6\x78\x31\x40\x43\x3D\x50\x72\x5F",0x90);
T_capk[8].length=0x90;
memcpy(T_capk[8].hash,"\xB4\xBC\x56\xCC\x4E\x88\x32\x49\x32\xCB\xC6\x43\xD6\x89\x8F\x6F\xE5\x93\xB1\x72",20);
//index 94
T_capk[9].index=0x94;
memcpy(T_capk[9].value,"\xD1\xBE\x39\x61\x5F\x39\x5A\xC9\x33\x7E\x33\x07\xAA\x5A\x7A\xC3\x5E\xAE\x00\x36\xBF\x20\xB9\x2F\x9A\x45\xD1\x90\xB2\xF4\x61\x6A\xBF\x9D\x34\x0C\xBF\x5F\xBB\x3A\x2B\x94\xBD\x8F\x2F\x97\x7C\x0A\x10\xB9\x0E\x59\xD4\x20\x1A\xA3\x26\x69\xE8\xCB\xE7\x53\xF5\x36\x11\x9D\xF4\xFB\x5E\x63\xCE\xD8\x7F\x11\x53\xCE\x91\x4B\x12\x4F\x3E\x6B\x64\x8C\xD5\xC9\x76\x55\xF7\xAB\x4D\xF6\x26\x07\xC9\x5D\xA5\x05\x17\xAB\x8B\xE3\x83\x66\x72\xD1\xC7\x1B\xCD\xE9\xBA\x72\x93\xFF\x34\x82\xF1\x24\xF8\x66\x91\x13\x0A\xB0\x81\x77\xB0\x2F\x45\x9C\x02\x5A\x1F\x3D\xFF\xE0\x88\x4C\xE7\x81\x22\x54\x2E\xA1\xC8\xEA\x09\x2B\x55\x2B\x58\x69\x07\xC8\x3A\xD6\x5E\x0C\x6F\x91\xA4\x00\xE4\x85\xE1\x11\x92\xAA\x4C\x17\x1C\x5A\x1E\xF5\x63\x81\xF4\xD0\x91\xCC\x7E\xF6\xBD\x86\x04\xCB\xC4\xC7\x4D\x5D\x77\xFF\xA0\x7B\x64\x1D\x53\x99\x8C\xDB\x5C\x21\xB7\xBC\x65\xE0\x82\xA6\x51\x3F\x42\x4A\x4B\x25\x2E\x0D\x77\xFA\x40\x56\x98\x6A\x0A\xB0\xCD\xA6\x15\x5E\xD9\xA8\x83\xC6\x9C\xC2\x99\x2D\x49\xEC\xBD\x47\x97\xDD\x28\x64\xFF\xC9\x6B\x8D",0xF8);
memcpy(T_capk[9].exponent,"\x01\x00\x01",3);
T_capk[9].length=0xF8;
}
//RSA recover function1
void Recover1(char index,unsigned char *ipkc,unsigned char *res)
{
NN_DIGIT RES[62],IPKC1[62],CAPK1[62],EXP;
unsigned int Nlen,Clen,type;
NN_AssignZero(RES,62);
NN_AssignZero(IPKC1,62);
NN_AssignZero(CAPK1,62);
Clen=T_capk[index].length;
Nlen=Clen/4;
if(index==9||index==10) type=1;
else type=0;
NN_Decode(IPKC1,Nlen,ipkc,Clen);
NN_Decode(CAPK1,Nlen,(unsigned char *)T_capk[index].value,Clen);
// Dis_deg_buf((char *)T_capk[index].exponent,sizeof(T_capk[index].exponent));
NN_Decode((NN_DIGIT *)EXP,1,T_capk[index].exponent,sizeof(T_capk[index].exponent));
NN_ModExp(RES,IPKC1,CAPK1,Nlen,type);
NN_Encode(res,Clen,RES,Nlen);
// Dis_deg_buf((char *)res,Clen);
}
//RSA recover function2
void Recover2(unsigned char *pkc,unsigned char *pk,unsigned char *exponent,int pklen,unsigned char *res)
{
NN_DIGIT RES[62],PKC[62],PK[62],EXP;
unsigned int Nlen,Clen,type;
NN_AssignZero(RES,62);
NN_AssignZero(PKC,62);
NN_AssignZero(PK,62);
Clen=pklen;
Nlen=Clen/4;
// test(exponent[0]);
if(exponent[0]==0x03) type=0;
else type=1;
// test(type);
NN_Decode(PKC,Nlen,pkc,Clen);
NN_Decode(PK,Nlen,pk,Clen);
NN_Decode((NN_DIGIT *)EXP,1,exponent,sizeof(exponent));
NN_ModExp(RES,PKC,PK,Nlen,type);
NN_Encode(res,Clen,RES,Nlen);
// Dis_deg_buf((char *)res,Clen);
}
//The functions followed is used by sha-1, create by cihuyf
//////////////////////////////////////////////////////////////
//function 1: Generate Message //
//input: //
// in: Original message //
// inlen: length of Original message //
//output: //
// out: message(64byte) //
//////////////////////////////////////////////////////////////
void Generate_MSG(char *in,int inlen,char *out,int outlen)
{
int i;
memset(out,0x00,outlen);
memcpy(out,in,inlen);
out[inlen]=0x80;
i=(inlen+8)/64+1;
out[outlen-3]=(inlen*8)/(256*256);
out[outlen-2]=(inlen*8)/256;
out[outlen-1]=(inlen*8)%256;
// Dis_deg_buf(out,sizeof(out));
}
//////////////////////////////////////////////////////////////
//function 2: logical function //
//input: //
// B: word32 //
// C: word32 //
// D: word32 //
//output: //
// out: word32 //
//function 3 and 5 is same, All use logical function 2 //
//////////////////////////////////////////////////////////////
word32 LFunc(word32 B,word32 C,word32 D,int type)
{
if(type<=19&&type>=0) return (B&C)|(~B&D);
else if(type<=39&&type>=20) return B^C^D;
else if(type<=59&&type>=40) return (B&C)|(B&D)|(C&D);
else return B^C^D;
}
//////////////////////////////////////////////////////////////
//function 3: COMPUTING THE MESSAGE DIGEST //
//input: //
// in: MSG //
// inlen: length of MSG //
//output: //
// out: dgt //
//////////////////////////////////////////////////////////////
word32 SFunc(word32 x,int n)
{
return ((x<<n)|(x>>(32-n)));
}
//////////////////////////////////////////////////////////////
//function 4: COMPUTING THE MESSAGE DIGEST //
//input: //
// in: MSG //
// inlen: length of MSG //
//output: //
// out: dgt //
//////////////////////////////////////////////////////////////
void Com_MSG_Dgt(char *MSG,int MSGLen,char *Dgt)
{
char msgtmp[530];
int block,msgtmplen;//,padding;
int i,j,k;
word32 W[80];
word32 wtmp1,wtmp2;
word32 h0,h1,h2,h3,h4;
word32 A,B,C,D,E;
h0=H0;
h1=H1;
h2=H2;
h3=H3;
h4=H4;
block=(MSGLen+8)/64;
// padding=MSGLen%64;
// test(block);
// Dis_deg_buf(MSG,MSGLen);
msgtmplen=((MSGLen+8)/64+1)*64;
Generate_MSG(MSG,MSGLen,msgtmp,msgtmplen);
// Dis_deg_buf(msgtmp,msgtmplen);
// test(2);
for(j=0;j<block+1;j++)
{
memset(W,0,80);
A=h0;
B=h1;
C=h2;
D=h3;
E=h4;
// test(j);
for(i=0;i<16;i++)
{
// if(j==block)
// {
// for(k=0;k<4;k++)
// {
// printf("%02x",msgtmp[4*i+k]);
// getkeycode(0);
// W[i]|=(word32)(msgtmp[4*i+k]);
// if(k<3) W[i]=W[i]<<8;
// }
// }
// else
// {
for(k=0;k<4;k++)
{
W[i]|=(word32)(msgtmp[4*i+64*j+k]);
if(k<3) W[i]=W[i]<<8;
}
// }
// printf("%08x\n",W[i]);
// getkeycode(0);
}
// test(3);
for(i=16;i<80;i++)
{
wtmp1=W[i-3]^W[i-8]^W[i-14]^W[i-16];
W[i]=SFunc(wtmp1,1);
}
// test(4);
for(i=0;i<80;i++)
{
// if(i>=0&&i<2)
// {
// clrscr();
// printf("%d:%08x %08x %08x %08x %08x",i,SFunc(A,5),LFunc(B,C,D,i),E,W[i],K[i/20]);
// getkeycode(0);
// }
wtmp2=SFunc(A,5)+LFunc(B,C,D,i)+E+W[i]+K[i/20];
E=D;
D=C;
C=SFunc(B,30);
B=A;
A=wtmp2;
// if(j==1)
// {
// clrscr();
// printf("%08x %08x %08x %08x %08x",A,B,C,D,E);
// getkeycode(0);
// }
}
h0+=A;
h1+=B;
h2+=C;
h3+=D;
h4+=E;
// clrscr();
// printf("%08x %08x %08x %08x %08x",h0,h1,h2,h3,h4);
// getkeycode(0);
}
for(i=0;i<4;i++) Dgt[i]=(h0<<(i*8))>>24;
for(i=0;i<4;i++) Dgt[i+4]=(h1<<(i*8))>>24;
for(i=0;i<4;i++) Dgt[i+8]=(h2<<(i*8))>>24;
for(i=0;i<4;i++) Dgt[i+12]=(h3<<(i*8))>>24;
for(i=0;i<4;i++) Dgt[i+16]=(h4<<(i*8))>>24;
// clrscr();
// for(i=0;i<20;i++) printf("%02x",Dgt[i]);
// getkeycode(0);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -