利用 Windows Crypt API 获取 MD5/SHA1 值

Excel实现MD5加密:VBA调用系统API的完整方案与避坑指南 哈希算法是数据安全与完整性校验的基础技术之一,它将任意长度的输入通过特定计算映射为固定长度的输出,具有单向性和抗碰撞性。MD5作为一种经典的哈希算法,其原理涉及位操作、模加和循环位移等步骤,生成128位的哈希值。在数据脱敏、唯一标识生成和数据一致性校验等场景中,MD5因其计算速度快、结果标准化而被广泛应用。对于需要在Excel环境中快速处理敏感信息或生成数据指纹的用户,例如业务分析师和运营人员,直接在Excel中实现MD5计算可以避免依赖外部脚本或在线工具,提升工作效率。本文聚焦于通过VBA调用Window 阅读详情

昨天有人给了我一段据说是根据网上的 java 程序改编的计算 md5 值的 vfp 代码,他说与他使用 md5 计算工具得到的 md5 值不同,想让我看看是哪里改编时出了问题。粗略看了一下,其实这段代码十分眼熟,在 csdn 的 vfp 讨论区中就曾出现过,只是我以前没有需要,所以都是一眼而过,但对那段长长的 hash 变换表却印象深刻。由于我也不知道具体的 md5 值算法,所以也只能先看那段 java 代码,并未发现转换中有何不妥之处。转念一想,Windows Crypt API 中不是也有计算 hash 值的函数吗?只是以前没用过,不熟悉,打开 msdn 找到 Crypt API 这一篇仔细阅读,再参考网上的一些资料,于是有了下面这段代码。 

兼回答 tszsc 朋友的问题:
另一种常见的文件/字符串校验方法是SHA1(也称SHA160),它产生的是160/8=20个字节的验证码,比MD5的16个字节稍长一点,只需将上面的代码稍作改造即可实现:
1. 加一个常量定义:#define CALG_SHA1    0x00008004
2. 将 lcHashValue = REPL... 这一句中的 16 改为 20
3. 将调用 CryptCreateHash 函数的第二个参数改成 CALG_SHA1
函数名改为 GetSHA1,如果你有空的话,将错误提示和注释中的 MD5 字样也改过来就更好了。

 

回答 cslx0810 朋友

这个问题提得有道理,我原来没想将这个函数用来计算超大文件,只想偶尔用来校验一些小数据量的值
下面是可以计算超大文件 md5 值的示例代码,是在上面代码的基础上做了少量修改
我的电脑比较差,用这段代码来计算一个700M的光盘ISO映像文件,用时一般在30秒左右
不过这可能除了跟 CPU/RAM 有关以外,跟文件是否有碎片以及硬盘速度也有很大关系
另外,代码中 BYTES_PER_READ 常量的取值也会对整个计算速度产生较大的影响
我试验的结果是一般要控制在256kb以内,再大就不仅不会快,反而更慢,大概就是俗话“贪多嚼不烂”的道理吧

 

VB6加密与压缩算法模块:AES、ZLib、MD5完整解决方案 加密与压缩是软件工程中保障数据安全和提升传输效率的基础技术。加密算法通过特定规则将明文转换为密文,确保信息机密性;压缩算法则通过消除数据冗余来减少存储空间和网络带宽占用。在遗留系统维护中,这些技术的价值尤为突出,它们能以较低成本显著提升老旧应用的安全性与性能。对于仍广泛运行于金融、医疗等领域的VB6系统,直接集成现代算法面临生态支持不足的挑战。本文提供的解决方案,通过封装Windows CryptAPI和ZLib等成熟技术,构建了包含AES对称加密、ZLib数据压缩和MD5哈希校验的完整模块。该模块采用分层 阅读详情

相关推荐

易语言取多文件 文件夹、文件MD5(带进度条)能取多文件MD5码 速度很快 带进度条.rar

易语言取多文件 文件夹、文件MD5(带进度条)能取多文件MD5码 速度很快 带进度条.rar

vb计算文件的hash

vb计算文件的hash值的一个类  ‘----------------来源于网络 作者不详--------------------- Private Declare Function CryptAcquireContext Lib "advapi32.dll" _ Alias "CryptAcquireContextA" ( _ ByRef phProv As Long, _

Mradxz的专栏 1655

SHA 算法 160,224,256,384.512:实现所有 SHA 算法,SHA160、SHA224、SHA256、SHA384、SHA512-matlab开发

使用算法生成消息摘要:SHA160、SHA-224、SHA256、SHA384、SHA512 支持面向位的消息-- 以位为单位输入消息长度-- 输入消息 (HEX) 或-- 以比特为单位生成长度为 LEN 的随机消息-- 选择生成MESG DIGEST的算法LEN :: 输入面向位的消息长度应该是GT 0 方法:SHA1,SHA224,SHA256,SHA384,SHA512 GEN :: 0 --> 输入 MESG(十六进制)或限制 :: 如果 MSG_LEN > 2^12,Matlab 无法读取字符-----如果MESG_LENGTH> 2 ^ 12直接将MSG分配给msg_str 1 --> 这个 HASH 函数生成一个伪随机数留言。 LEN 位长度<> MESG 中的比特数应为 GT LEN <> 在 CMD 提示符下不要给任何空格<> 进入 HEX MESG 时-- <记住安全的

SHA安全散列算法

文章目录前言SHA 安全散列算法SHA家族SHA1SHA256SHA384、SHA512安全性Java 中的 SHA使用 commons-codec代码举例Java结果-使用16进制展示 前言 体能状态先于精神状态,习惯先于决心,聚焦先于喜好。 SHA 安全散列算法 安全散列算法(英语:Secure Hash Algorithm,缩写为SHA)是一个密码散列函数家族. 和MD5类似,安全散列...

༺ bestcxx的专栏 ༻ 1571

ISP-全局色调映射(GTM)算法简单实现

色调映射算法,色彩空间转换LAB

notgoodenouf的博客 2241

GB28181 2022 配置信令

基本参数视频参数选项视频参数属性配置巡航轨迹

ww506772362的专栏 1633

windows C cryptAPI 实现SHA1

不太确认结果对不对,记录一下,供大家参考 /* info 是源数据 sha1是结果 */ int getSha1Value(char * info, char* sha1) { HCRYPTPROV hCryptProv; DWORD dwHashLen; DWORD dwHashLen...

500

使用TBtools进行物种间共线性分析

Sequence Toolkit ---Fasta Tools ----ID Prefix (fasta文件)

sunny_dayone的博客 8753

使用wincrypt进行md5加密

发一下之前在用c++写windows下的爬虫的时候用到的代码,非常羡慕php用自带的md5函数直接使用即可。在windows环境下可以用第三方库或winapi来进行md5摘要。 以下为自己写好的一个md5加密类,为了方便类成员变量都采用了public的权限,仅供参考 ## GlobalLib 自己定义的一些宏工具和可能用到的头文件(因为是之前项目里的所以我直接拷贝了) ## #pragma ...

thread 2217

骗分导论 CSP、NOIP、蓝桥杯、PAT、USACO等竞赛的算法骗分技巧 轻松省三

问题来了,那么多座桥,炸一座就破坏岛屿的联系,可能性微乎其微(除非特别设计数据)。它们的价值极大,不仅能初步帮你检验程序的对错,而且,如果你不会做这道题,你就可以直接输出样例!在OI考试中最后难的题数据最后的几个,他们往往不会创造新的数据,此时就可以直接输出最后几个数据了。需要运用《骗分导论》第3章中学到的知识,先写出朴素算法,然后造一些数据,可能就会发现规律。有些时候,问题的答案可能很有特点:对于大多数情况,答案是一样的。据说,在NOIP2013中,有人最后一题不会,愤然打了个随机数,结果得了。

星卯教育-信奥教练tony 6405

Springboot+Vue 实现鸿蒙商城管理系统开发实践

通过使用 Springboot 和 Vue 技术栈,我们成功实现了鸿蒙商城管理系统的开发。系统具备用户管理、商品管理、订单管理、库存管理和统计分析等功能,支持 Web 端和鸿蒙端的访问和操作。在开发过程中,我们充分利用了 Springboot 的快速开发优势和 Vue 的组件化开发特点,提高了开发效率和系统的可维护性。同时,通过与鸿蒙设备的集成,实现了多设备之间的数据交互和协同工作,提升了用户体验。

ZXJ_SXT的博客 1324

MD5/SHA 加密处理

看来需要用这个才是关键的处理。利用SHA1 源码来处理超大文件的checksum值计算真的好慢。改用:Windows Crypt API。先尝试一下看不看快起来。

hanyuxinting的专栏 1127

数据分析!Python爬虫爬取B站UP主数据并分析涨粉规律(附可视化图表)

爬取更多UP主:扩充列表,增加需要分析的UP主UID数量爬取更多作品:修改的参数,增加每个UP主的作品爬取页数新增分析维度:在类中添加方法,可分析发布时间(如定时发布对涨粉的影响)、内容标签(如游戏/知识区涨粉差异)优化可视化样式:调整方法中的图表类型、颜色、标题等,适配个人展示需求播放量与粉丝数强正相关:从相关性热力图可看出,总播放量与粉丝数的相关系数通常在0.8以上,说明曝光量是涨粉的核心基础作品数量存在“边际效应”

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1226

c++计算 md5 sha1 sha256值

//#include "stdafx.h" #include <Windows.h> #include <stdio.h> void ShowError(const char *pszText) { char szErr[MAX_PATH] = { 0 }; ::wsprintf(szErr, "%s Error[%d]\n", pszText, ::GetLastError()); #ifdef _DEBUG ::MessageBox(NULL, szE.

wzxiaodu的专栏 723

03 Token、Embedding、上下文窗口:开发者必须懂的三个基本概念

Token、Embedding 和上下文窗口是大模型应用开发的三个基础概念。本文从成本、速度、检索和上下文设计四个角度讲清它们的工程意义,帮助开发者理解为什么同一段内容会超限、变贵,为什么 RAG 能做语义检索。

老于的笔记的专栏 410

实现边缘实时动物检测:YOLOv5模型优化与树莓派4B部署全攻略

本文介绍了基于高性能计算机训练YOLOv5目标检测模型,并部署到树莓派4B实现实时动物检测的全流程。主要内容包括:1)在高性能计算机上通过Anaconda创建虚拟环境,安装YOLOv5项目并进行模型训练;2)将训练好的best.pt模型迁移到树莓派,配置轻量级Miniconda环境;3)连接树莓派摄像头,运行实时检测程序。该系统兼顾了训练效率和边缘设备部署的实用性,可广泛应用于智慧农业、生态监测等场景。文中详细说明了数据准备、环境配置和部署步骤,为开发轻量级目标检测系统提供了完整参考方案。

m0_64661770的博客 201

VB MD5

<br />Option Explicit<br />Private Declare Function CryptAcquireContext Lib "advapi32.dll" _<br />   Alias "CryptAcquireContextA" ( _<br />   ByRef phProv As Long, _<br />   ByVal pszContainer As String, _<br />   ByVal pszProvider As String, _<br />   ByV

BestBadGod的专栏 852

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

crypt。解密的php,超强php加解密扩展:cryptopp

cryptopp是一个用c++编写的超强加解密扩展.性能优异可靠.完全可以替换所有PHP编写的加解密类.不仅如此,它的提供的编程接口非常简明易用,可说是PHP程序员必备扩展.cryptopp扩展的接口如下:class cryptopp {public function __construct($param);public function setkey($param);public functio...

weixin_36474955的博客 240

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

MD5算法逆向分析:从原理识别到安全攻防实战

密码散列函数是信息安全领域的核心基础组件,它将任意长度的输入数据映射为固定长度的输出值,这一单向性特性使其广泛应用于数据完整性校验、密码存储和数字签名等场景。其核心原理基于压缩函数和位运算,通过多轮迭代处理生成唯一的“数字指纹”。在工程实践中,散列函数的技术价值在于提供高效的数据一致性验证和身份认证机制,常见的应用包括软件包校验、区块链交易验证和用户登录系统。然而,随着计算能力的提升和密码分析学的发展,部分早期算法如MD5已被证明存在碰撞漏洞,这直接关系到系统安全防线。本文聚焦于MD5算法在逆向工程中的特征

weixin_33804582的博客 464

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

获取windows下执行文件签名和证书信息

获取证书信息验证文件数字签名是否有效可以使用函数 WinVerifyTrust,可以用:取得文件数字签名证书信息需要使用函数 CryptQueryObject,再用CertFindCertificateInStore获取证书Cert也可以通过,WTHelperProvDataFromStateData WTHelperGetProvSignerFromChain WTHelperGetProvCe...

weixin_34232617的博客 6030

python比较两个文件内容是否一样_Windows下比较两个大文件内容是否相同,有什么好工具?...

如果只是比较是否相同用哈希工具比较一下就可以了,Beyond Compare 会显示差异内容打开可能有点慢。用AAuto写的小工具试了一下计算出2GB文件MD5,SHA1,CRC32等哈希值耗时1分钟 源代码:import win.ui;/*DSG{{*/var winform = ..win.form(text="AAuto Hasher - 计算文件的MD5,SHA1,CRC32校验值";ri...

weixin_39681058的博客 195

CrackRTF

32位exe文件这个题从前往后看。

flycard12138的博客 1007

VC HASH函数

    在程序很多地方都需要使用到MD5与SHA1之类的HASH函数,当然你可以自己实现,或去网上找实现的源码,但如果你在VC环境中的话,你就没有必要了,直接可以调用CAPI了,在程序中加上的头文件#include &lt;wincrypt.h&gt;     下面的函数可以完成计算Hash的功能:// 计算Hash,成功返回0,失败返回GetLastError() // CONST BYTE...

weixin_34354173的博客 162

第二次课,文件校验(预习)

1、hash CRC32–开销比较小 ,MD5,SHA1,SHA256 --运行开销,自定义的简单hash ,oxxxdxg.exe 长度,第一个字符是0 第四个字符是d 第六个是g 存在碰撞的可能。1、在上次课的基础上把所有枚举出来的进程以及进程模块的文件hash值[MD5 sha-1,sha256]计算出来;存在父进程id的进程一并把父进程信息给关联起来一并输出;2、使用注册表接口,把注册表中的服务信息枚举出来,并输出关联的二进制路径,思考一下使用服务接口枚举的服务和注册表枚举的服务如何关联。

m0_72827793的博客 288
上一篇: 处理超过 2G 的 DBF 表
下一篇: 关于可滚动容器
都市夜猫
博客等级 码龄19年 321粉丝 67原创
评论 11
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值