PB实现DES加解密

PB生成时间戳、MD5加密、生成二维码、用于微信扫码支付 阅读详情

填充模式

加密操作前需要将明文分解成长度为8的块,若明文长度不是8的倍数则需要填充到8的倍数,以下是两张填充方式:
PKCS5:若数据需要填充n个字节才能对齐,则填充的每个字节值都是n;若数据已对齐,则填充一个长度为8的块,填充的每个字节值都是8
Zero:数据长度对齐时不填充,否则填充0

加密模式

ECB:电码本模式
CBC:密码分组链接模式
详细的加密流程参考 对称加密和分组加密中的四种模式(ECB、CBC、CFB、OFB)

ECB模式加解密操作

设置填充模式PKCS5,加密模式不用设置默认为ECB,秘钥DESPACS5,加密文本:PB实现DES/ECB模式加解密
在这里插入图片描述
十六进制密文为:D256468E014B4313BBF2E07E5BBDA9F8E9C6CDF1021AD55AA4C15B702FBAF205
base64密文为:0lZGjgFLQxO78uB+W72p+OnGzfECGtVapMFbcC+68gU=

解密上一步得到的十六进制密文
在这里插入图片描述
解密得到的明文为:PB实现DES/ECB模式加解密

CBC模式加解密操作

设置填充模式PKCS5,加密模式CBC,秘钥DESPACS5,初始化向量INITVECT,加密文本:PB实现DES/CBC模式加解密
在这里插入图片描述
十六进制密文为:DDB06F50F8A3B23105B5B1A0FABEA2ACA93A6C785AF25C79DADC93AE7457BB86
base64密文为:3bBvUPijsjEFtbGg+r6irKk6bHha8lx52tyTrnRXu4Y=

解密上一步得到的base64密文
在这里插入图片描述
解密得到的明文为:PB实现DES/CBC模式加解密

源代码

几个依赖项、demo中使用到的类源代码:
n_func_blob
n_func_radix
n_base64

发现BUG请留言或私信,以便修正(QQ:768310524 TEL:18649713925)
代码拷贝到文本编辑器,另存为 n_des.sru

$PBExportHeader$n_des.sru
forward
global type n_des from nonvisualobject
end type
type stbl from structure within n_des
end type
type sbox from structure within n_des
end type
end forward

type stbl from structure
	string		s_list[]
end type

type sbox from structure
	stbl		s_table[]
end type

global type n_des from nonvisualobject autoinstantiate
end type

type variables
public:
	CONSTANT STRING PKCS5 = 'PKCS5Padding'
	CONSTANT STRING Zero = 'ZeroPadding'
	
	CONSTANT STRING ECB = 'ECB'
	CONSTANT STRING CBC = 'CBC'

private:
	string padding = PKCS5
	string mode = ECB

	byte PC_1[] = {57,49,41,33,25,17,9,&
						1,58,50,42,34,26,18,&
						10,2,59,51,43,35,27,&
						19,11,3,60,52,44,36,&
						63,55,47,39,31,23,15,&
						7,62,54,46,38,30,22,&
						14,6,61,53,45,37,29,&
						21,13,5,28,20,12,4}
	
	byte PC_2[] = { 14,17,11,24,1,5,&
						 3,28,15,6,21,10,&
						 23,19,12,4,26,8,&
						 16,7,27,20,13,2,&
						 41,52,31,37,47,55,&
						 30,40,51,45,33,48,&
						 44,49,39,56,34,53,&
						 46,42,50,36,29,32}
	
	byte Rn[] = {1,1,2,2,2,2,2,2,1,2,2,2,2,2,2,1}
	
	byte IP[] = {58,50,42,34,26,18,10,2,&
					60,52,44,36,28,20,12,4,&
					62,54,46,38,30,22,14,6,&
					64,56,48,40,32,24,16,8,&
					57,49,41,33,25,17,9,1,&
					59,51,43,35,27,19,11,3,&
					61,53,45,37,29,21,13,5,&
					63,55,47,39,31,23,15,7}
	
	byte BIT_SELECTION[] = {32,1,2,3,4,5,&
										4,5,6,7,8,9,&
										8,9,10,11,12,13,&
										12,13,14,15,16,17,&
										16,17,18,19,20,21,&
										20,21,22,23,24,25,&
										24,25,26,27,28,29,&
										28,29,30,31,32,1}
									
	byte P[] = { 16,7,20,21,&
					29,12,28,17,&
					1,15,23,26,&
					5,18,31,10,&
					2,8,24,14,&
					32,27,3,9,&
					19,13,30,6,&
					22,11,4,25}
	
	byte IP_1[] = { 40,8,48,16,56,24,64,32,&
						39,7,47,15,55,23,63,31,&
						38,6,46,14,54,22,62,30,&
						37,5,45,13,53,21,61,29,&
						36,4,44,12,52,20,60,28,&
						35,3,43,11,51,19,59,27,&
						34,2,42,10,50,18,58,26,&
						33,1,41,9,49,17,57,25}
	
	string Kn[16]
	char iv[]
	
	SBOX S_BOX[]
	
	n_func_blob fblob

end variables

forward prototypes
public subroutine setkey (blob key)
public subroutine setiv (blob ivector)
private subroutine calc_keys (blob key)
public subroutine setmode (string m)
public subroutine setpadding (string pd)
public function blob encode (blob buf)
public function blob decode (blob cypher)
private subroutine calc_blocks (string blocks[], boolean flag, ref string result[])
private function string calc_block (string block, boolean flag)
private function string fun (string r, string k)
end prototypes

public subroutine setkey (blob key);long length

length = len(key)
if length > 8 then
	key = blobmid(key , 1 , 8)
elseif length < 8 then
	key += fblob.fill(0 , 8 - length)
end if

calc_keys(key)
end subroutine

public subroutine setiv (blob ivector);long length

length = len(ivector)
if length > 8 then
	ivector = blobmid(ivector , 1 , 8)
elseif length < 8 then
	ivector += fblob.fill(0 , 8 - length)
end if

iv = fblob.Blob2Bin(ivector)
end subroutine

private subroutine calc_keys (blob key);char key_bit[]
char kn_bit[]
string c,d
char cd[]
char k_bit[]
int i,j
string k

key_bit = fblob.Blob2Bin(key)
for i = 1 to 56
	kn_bit[i] = key_bit[PC_1[i]]
next

k = string(kn_bit)
c = left(k,28)
d = right(k,28)

for i = 1 to 16
	c = mid(c,Rn[i] + 1) + left(c,Rn[i])
	d = mid(d,Rn[i] + 1) + left(d,Rn[i])
	cd = c + d
	for j = 1 to 48
		k_bit[j] = cd[PC_2[j]]
	next
	Kn[i] = k_bit
next

end subroutine

public subroutine setmode (string m);mode = m
end subroutine

public subroutine setpadding (string pd);padding = pd
end subroutine

public function blob encode (blob buf);blob rblob
int li_padding,li_value
char pchar[],hchar[],vchar[]
long i,j
long ll_len,ll_loop,ll_point
blob blockblob[]
string block[],cypher[],cypherhex[]
byte lbyte[],rbyte[]
string result

if upperbound(Kn) <= 0 then return rblob
if len(buf) <= 0 then return rblob

lbyte = GetByteArray(buf)
choose case padding
	case PKCS5
		li_padding = 8 - mod(len(buf),8)
		li_value = li_padding
	case Zero
		li_padding = 8 - mod(len(buf),8)
		if li_padding = 8 then li_padding = 0
		li_value = 0
	case else
		return rblob
end choose

ll_len = upperbound(lbyte)
for i = 1 to li_padding
	lbyte[ll_len + i] = li_value
next

ll_loop = fblob.slice(blob(lbyte) , 8 , blockblob)
for i = 1 to ll_loop
	block[i] = fblob.Blob2Bin(blockblob[i])
next

calc_blocks(block , true , cypher)

for i = 1 to ll_loop
	pchar = cypher[i]
	ll_point = 1
	for j = 1 to 8
		rbyte[8 * i - 8 + j] = byte(pchar[ll_point]) * 128 +&
									 byte(pchar[ll_point + 1]) * 64 +&
									 byte(pchar[ll_point + 2]) * 32 +&
									 byte(pchar[ll_point + 3]) * 16 +&
									 byte(pchar[ll_point + 4]) * 8 +&
									 byte(pchar[ll_point + 5]) * 4 +&
									 byte(pchar[ll_point + 6]) * 2 +&
									 byte(pchar[ll_point + 7])
		ll_point += 8
	next
next

return blob(rbyte)
end function

public function blob decode (blob cypher);blob lblb
long ll_len,ll_loop,ll_point
long i,j
char bchar[]
blob blockblob[]
string block[],result[]
byte lbyte[]
int li_padding

ll_len = len(cypher)
if ll_len <= 0 then return lblb
if mod(ll_len,8) <> 0 then return lblb

ll_loop = fblob.slice(cypher , 8 , blockblob)
for i = 1 to ll_loop
	block[i] = fblob.Blob2Bin(blockblob[i])
next

calc_blocks(block,false,result)

for i = 1 to ll_loop
	bchar = result[i]
	ll_point = 1
	for j = 1 to 8
		lbyte[8 * i - 8 + j] = byte(bchar[ll_point]) * 128 +&
									 byte(bchar[ll_point + 1]) * 64 +&
									 byte(bchar[ll_point + 2]) * 32 +&
									 byte(bchar[ll_point + 3]) * 16 +&
									 byte(bchar[ll_point + 4]) * 8 +&
									 byte(bchar[ll_point + 5]) * 4 +&
									 byte(bchar[ll_point + 6]) * 2 +&
									 byte(bchar[ll_point + 7]) 
		ll_point += 8
	next
next

choose case padding
	case PKCS5
		li_padding = lbyte[upperbound(lbyte)]
	case Zero
		
	case else
		return lblb
end choose

lblb = blob(lbyte)
return blobmid(lblb,1,len(lblb) - li_padding)
end function

private subroutine calc_blocks (string blocks[], boolean flag, ref string result[]);int i,j
long ll_loop
char vchar[],pchar[]

ll_loop = upperbound(blocks)
choose case mode
	case ECB
		for i = 1 to ll_loop
			result[i] = calc_block(blocks[i] , flag)
		next
	case CBC
		vchar = iv
		if flag then
			for i = 1 to ll_loop
				pchar = blocks[i]
				for j = 1 to 64
					if pchar[j] = vchar[j] then
						pchar[j] = '0'
					else
						pchar[j] = '1'
					end if
				next
				result[i] = calc_block(pchar , flag)
				vchar = result[i]
			next
		else
			for i = 1 to ll_loop
				pchar = calc_block(blocks[i] , flag)
				for j = 1 to 64
					if pchar[j] = vchar[j] then
						pchar[j] = '0'
					else
						pchar[j] = '1'
					end if
				next
				result[i] = pchar
				vchar = blocks[i]
			next
		end if
	case else
		
end choose

end subroutine

private function string calc_block (string block, boolean flag);
char pchar[],vtempchar[],result[]
char lnchar[],rnchar[],ltempchar[],rtempchar[]
string vstr
int i,j
string l,r,k

pchar = block
for i = 1 to 64
	vtempchar[i] = pchar[IP[i]]
next

vstr = vtempchar
lnchar = left(vstr,32)
rnchar = right(vstr,32)
for i = 1 to 16
	ltempchar = lnchar
	lnchar = rnchar
	if flag then
		k = Kn[i]
	else
		k = Kn[17 - i]
	end if
	rtempchar = fun(rnchar,k)
	for j = 1 to 32
		if ltempchar[j] = rtempchar[j] then
			rnchar[j] = '0'
		else
			rnchar[j] = '1'
		end if
	next
next

vtempchar = string(rnchar) + string(lnchar)
for i = 1 to 64
	result[i] = vtempchar[IP_1[i]]
next

return result
end function

private function string fun (string r, string k);char rchar[],echar[],kchar[],bchar[],schar[],result[]
string stemp
int i
byte row,col,vtemp

rchar = r
kchar = k
for i = 1 to 48
	echar[i] = rchar[BIT_SELECTION[i]]
	if echar[i] = kchar[i] then
		bchar[i] = '0'
	else
		bchar[i] = '1'
	end if
next

for i = 1 to 8
	vtemp = 6 * i - 5
	row = byte(bchar[vtemp]) * 2 + byte(bchar[vtemp + 5]) + 1
	col = byte(bchar[vtemp + 1]) * 8 + byte(bchar[vtemp + 2]) * 4 + byte(bchar[vtemp + 3]) * 2 + byte(bchar[vtemp + 4]) + 1
	stemp += S_BOX[i].S_TABLE[row].S_LIST[col]
next

schar = stemp
for i = 1 to 32
	result[i] = schar[P[i]]
next

return result
end function

on n_des.create
call super::create
TriggerEvent( this, "constructor" )
end on

on n_des.destroy
TriggerEvent( this, "destructor" )
call super::destroy
end on

event constructor;
S_BOX[1].S_TABLE[1].S_LIST = {'1110','0100','1101','0001','0010','1111','1011','1000','0011','1010','0110','1100','0101','1001','0000','0111'}
S_BOX[1].S_TABLE[2].S_LIST = {'0000','1111','0111','0100','1110','0010','1101','0001','1010','0110','1100','1011','1001','0101','0011','1000'}
S_BOX[1].S_TABLE[3].S_LIST = {'0100','0001','1110','1000','1101','0110','0010','1011','1111','1100','1001','0111','0011','1010','0101','0000'}
S_BOX[1].S_TABLE[4].S_LIST = {'1111','1100','1000','0010','0100','1001','0001','0111','0101','1011','0011','1110','1010','0000','0110','1101'}

S_BOX[2].S_TABLE[1].S_LIST = {'1111','0001','1000','1110','0110','1011','0011','0100','1001','0111','0010','1101','1100','0000','0101','1010'}
S_BOX[2].S_TABLE[2].S_LIST = {'0011','1101','0100','0111','1111','0010','1000','1110','1100','0000','0001','1010','0110','1001','1011','0101'}
S_BOX[2].S_TABLE[3].S_LIST = {'0000','1110','0111','1011','1010','0100','1101','0001','0101','1000','1100','0110','1001','0011','0010','1111'}
S_BOX[2].S_TABLE[4].S_LIST = {'1101','1000','1010','0001','0011','1111','0100','0010','1011','0110','0111','1100','0000','0101','1110','1001'}

S_BOX[3].S_TABLE[1].S_LIST = {'1010','0000','1001','1110','0110','0011','1111','0101','0001','1101','1100','0111','1011','0100','0010','1000'}
S_BOX[3].S_TABLE[2].S_LIST = {'1101','0111','0000','1001','0011','0100','0110','1010','0010','1000','0101','1110','1100','1011','1111','0001'}
S_BOX[3].S_TABLE[3].S_LIST = {'1101','0110','0100','1001','1000','1111','0011','0000','1011','0001','0010','1100','0101','1010','1110','0111'}
S_BOX[3].S_TABLE[4].S_LIST = {'0001','1010','1101','0000','0110','1001','1000','0111','0100','1111','1110','0011','1011','0101','0010','1100'}

S_BOX[4].S_TABLE[1].S_LIST = {'0111','1101','1110','0011','0000','0110','1001','1010','0001','0010','1000','0101','1011','1100','0100','1111'}
S_BOX[4].S_TABLE[2].S_LIST = {'1101','1000','1011','0101','0110','1111','0000','0011','0100','0111','0010','1100','0001','1010','1110','1001'}
S_BOX[4].S_TABLE[3].S_LIST = {'1010','0110','1001','0000','1100','1011','0111','1101','1111','0001','0011','1110','0101','0010','1000','0100'}
S_BOX[4].S_TABLE[4].S_LIST = {'0011','1111','0000','0110','1010','0001','1101','1000','1001','0100','0101','1011','1100','0111','0010','1110'}

S_BOX[5].S_TABLE[1].S_LIST = {'0010','1100','0100','0001','0111','1010','1011','0110','1000','0101','0011','1111','1101','0000','1110','1001'}
S_BOX[5].S_TABLE[2].S_LIST = {'1110','1011','0010','1100','0100','0111','1101','0001','0101','0000','1111','1010','0011','1001','1000','0110'}
S_BOX[5].S_TABLE[3].S_LIST = {'0100','0010','0001','1011','1010','1101','0111','1000','1111','1001','1100','0101','0110','0011','0000','1110'}
S_BOX[5].S_TABLE[4].S_LIST = {'1011','1000','1100','0111','0001','1110','0010','1101','0110','1111','0000','1001','1010','0100','0101','0011'}

S_BOX[6].S_TABLE[1].S_LIST = {'1100','0001','1010','1111','1001','0010','0110','1000','0000','1101','0011','0100','1110','0111','0101','1011'}
S_BOX[6].S_TABLE[2].S_LIST = {'1010','1111','0100','0010','0111','1100','1001','0101','0110','0001','1101','1110','0000','1011','0011','1000'}
S_BOX[6].S_TABLE[3].S_LIST = {'1001','1110','1111','0101','0010','1000','1100','0011','0111','0000','0100','1010','0001','1101','1011','0110'}
S_BOX[6].S_TABLE[4].S_LIST = {'0100','0011','0010','1100','1001','0101','1111','1010','1011','1110','0001','0111','0110','0000','1000','1101'}

S_BOX[7].S_TABLE[1].S_LIST = {'0100','1011','0010','1110','1111','0000','1000','1101','0011','1100','1001','0111','0101','1010','0110','0001'}
S_BOX[7].S_TABLE[2].S_LIST = {'1101','0000','1011','0111','0100','1001','0001','1010','1110','0011','0101','1100','0010','1111','1000','0110'}
S_BOX[7].S_TABLE[3].S_LIST = {'0001','0100','1011','1101','1100','0011','0111','1110','1010','1111','0110','1000','0000','0101','1001','0010'}
S_BOX[7].S_TABLE[4].S_LIST = {'0110','1011','1101','1000','0001','0100','1010','0111','1001','0101','0000','1111','1110','0010','0011','1100'}

S_BOX[8].S_TABLE[1].S_LIST = {'1101','0010','1000','0100','0110','1111','1011','0001','1010','1001','0011','1110','0101','0000','1100','0111'}
S_BOX[8].S_TABLE[2].S_LIST = {'0001','1111','1101','1000','1010','0011','0111','0100','1100','0101','0110','1011','0000','1110','1001','0010'}
S_BOX[8].S_TABLE[3].S_LIST = {'0111','1011','0100','0001','1001','1100','1110','0010','0000','0110','1010','1101','1111','0011','0101','1000'}
S_BOX[8].S_TABLE[4].S_LIST = {'0010','0001','1110','0111','0100','1010','1000','1101','1111','1100','1001','0000','0011','0101','0110','1011'}



end event


pb9:二维码生成与信息加解密实用教程 对称加密是一种加密和解密使用相同密钥的加密技术,其算法简单、加密解密速度快,但密钥的管理和分发成为了主要挑战。对称加密算法包括数据加密标准(DES)、高级加密标准(AES)、国际数据加密算法(IDEA)等。DES是一种经典的对称加密算法,它使用固定的56位密钥对64位的明文进行加密。虽然DES已被认为不够安全,不再被广泛用于敏感数据的加密,但了解DES的工作原理对深入理解对称加密算法有重要的教育意义。 阅读详情

相关推荐

pb json 生成、解析,dw导入导出json(20211208更新)

采用pb11.5 + pbni + vs2015 + rapidjson的开源库,生成解析json,支持datawindow快速导入导出字段名有大写字母的json(dw的字段名全为小写字母,可在column属性的tag设置),支持dw导出json时对指定字段进行des加密,并在导入到dw时时进行des解密,相较之前版本增加了几个函数,应付一般的webapi接口是可以的,12.5可自行升级,修改了pbvm115.dll(内存修改方法的文件,请看n_datastore的api定义),******20211208更新,1.新增of_haskey(是否有key),of_isnull(是否为空),具体请看demo里面生成三的代码,2.简化了几乎所有函数名称,原来的函数名还存在,3.大幅提高dw导入导出json的效率(应该是目前PB最高效的dw导入导出json),dw导入json数据增加一种按json元素顺序导入,不校验字段名。****demo目录中的dll大部份是vc14的运行库,程序用到的除了pb运行库只有BDM.dll,ganpbjson.dll,pbvmxxa.dll

PB DES、3DES加密解密(简单便捷)

PB DES\3DES加密解密 通过VDN的uo_vdncore组件快速简单实现PB的DES、3DES、AES、RSA、Base64、Hex、SHA、MD5、HMac等类型的加密解密,本章我们主要讲解一下PB的DES及3DES加解密 QQ技术交流群: 130377874 获取最新版本VDN组件 一、导入组件 1.1、首先将Example\IE运行导入组件\导入组件\PB*\uo_vd...

softvery的专栏 3313

PB加密工具

PB加密工具,包含2个文件:PowerShield.exe和pb伪码清除器.exe

【亲测免费】 强大的PB加密与编码工具库:保障数据安全的利器

强大的PB加密与编码工具库:保障数据安全的利器 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在当今数字化时代,数据安全已成为企业和开发者关注的焦点。为了帮助PowerBuilder(PB)开发者更高效地处理数据加密与编码问题,我们推出了PB加密与编码工具库。这个开源项目提供了一系列常用的加密与编码功能,包括MD5加密、DES加解密以及Base64编码,旨在为PB开发...

gitblog_09780的博客 562

pb将带分隔符字符串转为SQL IN语句字符串

POWERBLUIDE11 将带有分隔符的字符串,转为SQL IN语句中需要的格式字符串;如:ABCD1234,ABCD5678 转换为 'ABCD1234','ABCD5678'然后可放直接放入IN语句中。

pb技巧函数与字符串操作

PB中操作Excel的技巧集 oleobject sheet long ll_row_count,ll_col_count excel1 = CREATE OLEObject dd = excel1.connecttonewobject("Excel.Application") IF dd0 then messagebox('提示:','您的机器没有安装Microsoft Excel!',stopsign!) destroy excel1 return End if

AES加解密程序的实现

AES加解密程序的实现正常情况,用户不能访问sys.dbms_crypto,需要DBA授权:grant execute on dbms_crypto to crm;建立加解密的PKG_AES包:CREATE OR REPLACE PACKAGE PKG_AES IS FUNCTION F_ENCRYPT(I_INPUT_STRING VARCHAR2) RETURN VARCHAR2;...

weixin_30756499的博客 365

PB 加密应用

PB 加密应用,base64加密应用,大家可以参考!

【亲测免费】 PB加密与编码工具库

PB加密与编码工具库 去发现同类优质开源项目:https://gitcode.com/ 本仓库提供了一个资源文件,包含了PB(PowerBuilder)中常用的加密与编码功能,具体包括MD5加密、DES加解密以及Base64编码。此外,还附带了PB11.5版本的调用例程,方便开发者快速集成和使用。 功能介绍 MD5加密:支持对字符串进行MD5加密,确保数据的安全性。 DES加解密:提供DES算法...

gitblog_09768的博客 494

pb des 加密 解密 dll 示例

pb des 加密 解密 dll 示例 运行界面http://hi.youkuaiyun.com/attachment/201101/25/0_1295999881op80.gif

PB可用md5加密、des加解密,Base64编码DLL、附PB11.5调用例程

较之前上传版本增加了base64编码功能, md5、des、base64都增加了专门的unicode调用声明,方便多语言操作, 代码里有一个拖拽文件显示路径的sle

oracle实现aes解密_AES加解密程序的实现

正常情况,用户不能访问sys.dbms_crypto,需要DBA授权:grant execute on dbms_crypto to crm;建立加解密的PKG_AES包:CREATE OR REPLACE PACKAGE PKG_AES ISFUNCTION F_ENCRYPT(I_INPUT_STRING VARCHAR2) RETURN VARCHAR2;FUNCTION F_DECRYPT...

weixin_39843078的博客 737

PB关于字符进制数转化及base64加密、解密,nvo_base64.sru

PB关于字符进制数转化及base64加密、解密 1、字符型十六进制数转为十进制数值 2、十进制数转为十六进制字符 3、base64加密 4、base64解密 5、将blob转为byte数组

BP-Tool 功能介绍,下载地址

BP-Tool 是 EFTlab 公司开发的主要面向金融和智能卡的数据加解密,数据转换工具, 金融领域常用算法如AES RSA DES 都能计算,还能计算DUKPT AES/DES, 以及TR31 KBH的格式解析和数据包计算,另外还能提供EMV ATR parser(ATR命令解析),HSM加密机指令组包,Sim Card文件编辑和解析,功能多到吐血。(国密算法就不要想了) 搞 EF...

1万+

离线反激转换器反馈环路设计:从理论到实践的Type II补偿器详解

在开关电源设计中,反馈环路稳定性是决定电源性能与可靠性的核心。其本质是通过补偿网络对功率级的小信号特性进行校正,以构建一个具有足够相位裕度和增益裕度的闭环系统。反激转换器作为一种广泛应用的隔离拓扑,其功率级在连续导通模式(CCM)和非连续导通模式(DCM)下呈现不同的零极点特性,这直接决定了补偿器的选型。Type II补偿器因其传递函数中固有的积分环节、低频零点与高频极点,恰好能与反激功率级的1P2Z(一个极点、两个零点)特性形成互补,有效塑造理想的回路增益曲线,实现快速稳定的动态响应。本文聚焦于采用TL4

weixin_30162121的博客 501

RTC温度补偿:如何让时间分秒不差?

RTC(实时时钟)温度补偿技术通过"检测温度→计算误差→动态调整频率"的闭环机制,解决振荡器频率随温度变化导致的时间误差问题。核心步骤包括:1)高精度温度检测;2)基于温度-频率误差模型计算偏差;3)通过硬件(可编程电容/DAC)或软件方式调整振荡频率。该技术需突破温度检测精度、误差模型拟合、频率调整分辨率等关键点,根据不同应用场景(消费电子±5ppm至军工±0.1ppm)选择匹配方案。典型实现如STM32的分段线性补偿算法,可将工业级RTC精度提升至±2ppm以内。

上市公司前技术负责人,20 年软硬件深耕 + 百人研发团队管理经验,名校理工科背景加持。从技术攻坚到团队掌舵,沉淀海量项目实战与管理心得,专注分享软硬件干货、疑难问题解决方案,既是靠谱知识传播者,也盼链接优质项目共成长。 1229

2024年C C++最全DES加密解密算法(简单、易懂、超级详细)_des算法,2024年最新C C++程序员必经的实践之路

cout

2401_84976318的博客 1641

Ubuntu 24.04 下 NoMachine 极速安装与远程桌面配置全攻略

本文详细介绍了在Ubuntu 24.04系统下安装和配置NoMachine远程桌面的完整指南。从系统准备、分步安装到性能调优和常见问题解决,帮助用户快速实现低延迟的远程桌面访问。特别适合开发者和IT管理员在Linux环境下高效部署远程工作环境。

moon9的博客 945

php bouncy castle,基础才是重中之重~BouncyCastle实现的DES3加密~java通用

对于BouncyCastle类库(包)来说,他提供了很多加密算法,在与.net和java进行相互加解密过程中,得到了不错的应用,本文以DES3为例,来说一下DES3加解密的过程。加密过程明文字符转为byte数组对密钥进行处理,处理后一般为16或者24字节对明文进行DES3加密,生成密文的byte数组对密文byte数组进行base64的编码解密过程对密文byte数组进行base64的解码对密钥进行处...

weixin_30467199的博客 442

HyperLynx VX2.5 实战:5分钟搞定LPDDR4X内存的批量仿真与报告分析

本文详细介绍了如何使用HyperLynx VX2.5进行LPDDR4X内存的批量仿真与报告分析,通过智能网络分组和并行计算技术,5分钟内即可完成全流程验证。文章涵盖工程准备、批量仿真配置、报告解析及典型问题解决方案,帮助工程师高效提升PCB仿真效率,确保移动设备内存接口的稳定性与性能。

weixin_42683394的博客 400

harbor x509: certificate signed by unknown authority【20251222】

本教程通过「合并证书链(服务器端)+ 预置根 CA(客户端)」彻底解决了自签名证书的 x509 错误,同时集成了 Trivy 漏洞扫描,实现了 Harbor 从搭建到实用的全流程。证书链合并是服务器端的关键,确保客户端获取完整信任路径;客户端需同时配置「系统信任库 + Docker 信任目录」,避免 Docker 独立信任机制导致的问题;所有 IP 需保持一致(Harbor 配置、证书绑定、客户端访问),是避免错误的基础。

老韩的Linux云计算架构师进阶之路 681

【PB续命02】Oracle中加密及编码等

Oracle中实现Md5/Base64/Aes+Base64/UrlEncode等加密编码的使用备忘,参考其它人的贴子,Oracle 11g 亲测有效。

REST2SQL ,JSON2WEB 2457

VSCode 搭建C/C++编程环境 2025新版图文安装教程(VSCode安装 + C/C++环境搭建 + 运行测试 + 背景图设置)

100%搭建成功,VSCode 搭建C++编程环境 2025新版图文安装教程(VSCode安装+C++环境搭建+运行测试+背景图设置)

Code_流苏:在代码中寻诗意,在实践中觅真知 2974

vue加解密

npm installcrypto-js npm installjs-md5 import CryptoJS from 'crypto-js'; export const appKey = 'cb6015828a44b5234ce9ed1c3bc7acb0'; import md5 from 'js-md5' export const calcuMD5 = (pwd) => { return md5(pwd) } export const SEEDMD5 = calcuMD5("U2Fs..

悟空— 4080

ZYNQ PS-PL数据交互方式总结

一,中断 二,IO方式:MIO EMIO GPIO 三,BRAM或FIFO或EMIF (1)通过BRAM实现PL/PS之间交互 PS 的配置如下图所示。使能 M_AXI_GP0 口,将 FCLK_CLK0 设为 100MHz,使能 PL 至 PS 的中断。 AXI BRAM Controller IP 核连接 PS 的 M_AXI_GP0 口和 BRAM,完成 AXI 接口至 BRAM 接口的转换。 添加BRAM,将BRAM设置为双口RAM,将PORTA与AXI B...

wangjie36的博客 1万+

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

上一篇: PB实现进制转换
下一篇: PB实现URL模式及MIME模式的BASE64加解密
JasonFriday
博客等级 码龄9年 254粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值