AES CBC的一个需要注意的地方
使用AES的CBC模式加密时会传入一个16字节的缓冲区作为初始向量(Initialization Vector)
然后这个东西加密时传入的时什么,那么解密的时候也要传入相对于的值,不然解密后的数据前16字节会乱码。
一般情况下大家都是传入16个00作为初始向量
但是有些情况下会传入非00值,笔者也是在做代码对接时才遇到这个问题。
如果不是被资深大佬的同事点到这个估计还要debug半天。。
使用AES的CBC模式加密时会传入一个16字节的缓冲区作为初始向量(Initialization Vector)
然后这个东西加密时传入的时什么,那么解密的时候也要传入相对于的值,不然解密后的数据前16字节会乱码。
一般情况下大家都是传入16个00作为初始向量
但是有些情况下会传入非00值,笔者也是在做代码对接时才遇到这个问题。
如果不是被资深大佬的同事点到这个估计还要debug半天。。
头文件不全请加载 JEDI Windows Security Code Library
{$POINTERMATH ON}
Function GetUserGroup():Integer; Var szComputer:Array [0..MAXCHAR] Of WideChar; Buffer :LPLOCALGROUP_INFO_1; nTotal :DWORD; nEntries :DWORD; hResume :PDWORD_PTR; nCount :DWORD; nStatus :DWORD; dwPrefMax :DWORD; lpszStr :Array [0..MAX_PATH] Of WideChar; iLen :Integer; iFull :Integer; begin Result := 0; nEntries := SizeOf(szComputer); GetComputerNameW(@szComputer, nEntries); nEntries := 0; nTotal := 0; Buffer := Nil; dwPrefMax := MAX_PREFERRED_LENGTH; hResume := Nil; Writeln('User Group:', szComputer); nStatus := NetLocalGroupEnum(szComputer, 0, PByte(Buffer), dwPrefMax, @nEntries, @nTotal, @hResume); if (nStatus = S_OK) Or (nStatus = ERROR_MORE_DATA) then begin for nCount := 0 to nTotal-1 do begin Inc(Result); if Buffer[nCount].lgrpi1_comment = Nil then Break; iLen := lstrlenW(Buffer[nCount].lgrpi1_comment); iFull:= 40 - Min(iLen, 32); ZeroMemory(@lpszStr, SizeOf(lpszStr)); FillSpaces(@lpszStr, 10, True); lstrcatW(lpszStr, Buffer[nCount].lgrpi1_comment); FillSpaces(@lpszStr[iLen + 10], iFull, True); lstrcatW(lpszStr, Buffer[nCount].lgrpi1_name); Writeln(lpszStr); end; end; if Buffer <> Nil then NetApiBufferFree(Buffer); Writeln('.Done!, Total: ', Result); end;
Function GetUsers():Integer; Var szComputer:Array [0..MAXCHAR] Of WideChar; Buffer :PUserInfo3; nTotal :DWORD; nEntries :DWORD; hResume :PDWORD_PTR; nCount :DWORD; dwPrefMax :DWORD; nStatus :DWORD; lpszStr :Array [0..MAX_PATH] Of WideChar; begin Result := 0; nEntries := SizeOf(szComputer); GetComputerNameW(@szComputer, nEntries); nEntries := 0; nTotal := 0; nEntries := 0; nTotal := 0; Buffer := Nil; dwPrefMax := MAX_PREFERRED_LENGTH; hResume := Nil; Writeln('User Group:', szComputer); nStatus := NetUserEnum(szComputer, 3, FILTER_NORMAL_ACCOUNT, PByte(Buffer), dwPrefMax, @nEntries, @nTotal, @hResume); if (nStatus = S_OK) Or (nStatus = ERROR_MORE_DATA) then begin for nCount := 0 to nTotal-1 do begin Inc(Result); if Buffer[nCount].usri3_name = Nil then begin if nCount < nTotal then begin Continue; end Else Break; end; ZeroMemory(@lpszStr, SizeOf(lpszStr)); FillSpaces(@lpszStr, 10, True); lstrcatW(lpszStr, Buffer[nCount].usri3_name); Writeln(lpszStr, #13); ZeroMemory(@lpszStr, SizeOf(lpszStr)); FillSpaces(@lpszStr, 15, True); lstrcatW(lpszStr, 'Remarks:'); lstrcatW(lpszStr, Buffer[nCount].usri3_comment); Writeln(lpszStr); ZeroMemory(@lpszStr, SizeOf(lpszStr)); FillSpaces(@lpszStr, 15, True); lstrcatW(lpszStr, 'Privilege:'); if Buffer[nCount].usri3_priv = 0 then begin lstrcatW(lpszStr, 'Guest'); end Else if Buffer[nCount].usri3_priv = 1 then begin lstrcatW(lpszStr, 'User'); end Else if Buffer[nCount].usri3_priv = 2 then begin lstrcatW(lpszStr, 'Admin'); end Else begin lstrcatW(lpszStr, 'UnKnown'); end; Writeln(lpszStr); if (Buffer[nCount].usri3_script_path <> Nil) And (lstrlenW(Buffer[nCount].usri3_script_path) > 0) then begin ZeroMemory(@lpszStr, SizeOf(lpszStr)); FillSpaces(@lpszStr, 15, True); lstrcatW(lpszStr, 'Login Script:'); lstrcatW(lpszStr, Buffer[nCount].usri3_script_path); Writeln(lpszStr); end; Writeln(''); end; end; if Buffer <> Nil then NetApiBufferFree(Buffer); Writeln('.Done!, Total: ', Result); end;
Type //定义个 PFileListItem = ^TFileListItem; TFileListItem = Record szName :String; szSize :String; End; Var //来个变量 FFileItemList :TList; Procedure ClearItemList(); Var //清空链表 I :Integer; begin For I := 0 to FFileItemList.Count-1 do begin //释放New出来的内存但是注意 Dispose不会直接把内存还给系统而且等待下一次New调用 Dispose(PFileListItem(FFileItemList[I])); end; FFileItemList.Clear; end; //添加 ListView Data事件 并将ListView的 OwnerData 属性设置为 True Procedure TForm.ListViewData(Sender: TObject; Item: TListItem); begin With PFileListItem(FFileItemList[Item.Index])^ do begin Item.Caption := szName; Item.SubItems.Add(szSize); end; end; //添加数据的时候 Var pFileItem :PFileListItem; I :Integer; Begin ClearItemList(); LockWindowUpdate(ListView.Handle); //通过句柄锁住ListView防止刷新 For I := 0 To 102400 Do Begin pFileItem := New(PFileListItem); pFileItem.szName := '这是文件名'; pFileItem.szSize := '1024Kb'; FFileItemList.Add(pFileItem); //添加到链表 End; ListView_File.Items.Count := FFileItemList.Count; LockWindowUpdate(0); //解锁 End;