VBA AES CBC 加密

2023-12-02

我在中提到了加密https://github.com/susam/aes.vbs下面是我最终得到的代码

Function Min(a, b)
    Min = a
    If b < a Then Min = b
End Function

Function B64Encode(bytes)
    Dim result As String
    Dim b64Block() As Byte
    Dim b64Enc As Object
    Dim utf8 As Object
    Dim Offset, Length, BlockSize As Integer
    
    Set b64Enc = CreateObject("System.Security.Cryptography.ToBase64Transform")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    BlockSize = b64Enc.InputBlockSize
    For Offset = 0 To LenB(bytes) - 1 Step BlockSize
        Length = Min(BlockSize, UBound(bytes) - Offset)
        b64Block = b64Enc.TransformFinalBlock((bytes), Offset, Length)
        result = result & utf8.GetString((b64Block))
    Next
    B64Encode = result
End Function

Function B64Decode(b64Str)
    Dim utf8 As Object
    Dim bytes() As Byte
    Dim b64Dec As Object
    
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")
    bytes = utf8.GetBytes_4(b64Str)
    B64Decode = b64Dec.TransformFinalBlock((bytes), 0, UBound(bytes))
End Function

Function Encrypt(plaintext, aesKey)
    Dim cipherBytes, aesKeyBytes, ivKeyBytes, plainBytes() As Byte
    
    Dim utf8, AES, aesEnc As Object
    Dim aesIV() As Byte
    Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    'Set cipherMode = GetObject("System.Security.Cryptography.CipherMode")
    AES.KeySize = 256
    AES.Mode = 1
    AES.Key = CreateObject("System.Text.UTF8Encoding").GetBytes_4("V$ry300DP3r$0NM3")
    AES.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4("HR$2pIjHR$2pIjPa")
    plainBytes = utf8.GetBytes_4(plaintext)
    'Set aesEnc = AES.CreateEncryptor_2((aesKeyBytes), (ivKeyBytes))
    cipherBytes = AES.TransformFinalBlock((plainBytes), 0, UBound(plainBytes))
        
    Encrypt = B64Encode(cipherBytes)
End Function

现在上面的代码告诉我“指定的初始化向量 (iv) 与该算法的块大小不匹配”

我们可以设置IV动态吗?


Function Min(a, b)
    Min = a
    If b < a Then Min = b
End Function

Function B64Encode(bytes)
    Dim result As String
    Dim b64Block() As Byte
    Dim b64Enc As Object
    Dim utf8 As Object
    Dim Offset, Length, BlockSize As Integer
    
    Set b64Enc = CreateObject("System.Security.Cryptography.ToBase64Transform")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    BlockSize = b64Enc.InputBlockSize
    For Offset = 0 To LenB(bytes) - 1 Step BlockSize
        Length = Min(BlockSize, UBound(bytes) - Offset)
        b64Block = b64Enc.TransformFinalBlock((bytes), Offset, Length)
        result = result & utf8.GetString((b64Block))
    Next
    B64Encode = result
End Function

Function B64Decode(b64Str)
    Dim utf8 As Object
    Dim bytes() As Byte
    Dim b64Dec As Object
    
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    Set b64Dec = CreateObject("System.Security.Cryptography.FromBase64Transform")
    bytes = utf8.GetBytes_4(b64Str)
    B64Decode = b64Dec.TransformFinalBlock((bytes), 0, UBound(bytes))
End Function


Function Encrypt(plaintext, aesKey)
    Dim cipherBytes, aesKeyBytes, ivKeyBytes, plainBytes() As Byte
    
    Dim utf8, AES, aesEnc, cipherMode As Object
    Dim aesIV() As Byte
        
    Set AES = CreateObject("System.Security.Cryptography.RijndaelManaged")
    Set utf8 = CreateObject("System.Text.UTF8Encoding")
    'Set cipherMode = CreateObject("System.Security.Cryptography.CipherMode")
    
    AES.KeySize = 256
    AES.BlockSize = 256
    'CipherMode.CBC
    AES.Mode = 1
    'PaddingMode.PKCS7
    AES.Padding = 2
    AES.Key = CreateObject("System.Text.UTF8Encoding").GetBytes_4("ThirtyTwoBytes3$ThirtyTwoBytes3$")
    AES.IV = CreateObject("System.Text.UTF8Encoding").GetBytes_4("3$ThreeTwoBytes3$ThreeTwoBytes3$")
    'plainBytes = utf8.GetBytes_4(plaintext)
    plainBytes = B64Decode(plaintext)
    'Set aesEnc = AES.CreateEncryptor_2((aesKeyBytes), (ivKeyBytes))
    cipherBytes = AES.CreateEncryptor().TransformFinalBlock((plainBytes), 0, UBound(plainBytes))
        
    Encrypt = B64Encode(cipherBytes)
End Function

Sub encrypt_hell()
Debug.Print Encrypt("Hello", "PattamuthuArumug")
End Sub

我使用的是 AES CBC 256 位,因此必须使用 32 字节密钥和 IV

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

VBA AES CBC 加密 的相关文章

  • 我必须使用什么加密程序来通过 HTTP 协议发送加密的“电子邮件”和“密码”值?

    我正在使用 Ruby on Rails 3 我想通过 HTTP 协议发送 电子邮件 和 密码 值 我知道 我不应该 但我需要 我需要从发送用户凭据我的客户申请到一个我的服务应用 我可以使用公共和私人RSA密钥来实现这一点 但如果是这样 我不
  • 在 VBA 中捕获 shell 命令的输出值?

    发现这个功能http www cpearson com excel ShellAndWait aspx http www cpearson com excel ShellAndWait aspx 但我还需要捕获 shell 的输出 有什么代
  • 在 Excel 中自动复制和粘贴特定范围的最佳方法是什么?

    我对 VBA 非常陌生 我想自动化一项任务 但不知道从哪里开始 我有一个如下所示的数据集 样本数据 https i stack imgur com jxqFI png 我想做的是循环遍历 A 列 如果其中有内容 始终是电子邮件 请选择所有行
  • 数据透视表错误 |无效的调用或过程

    我需要一些帮助来解决这个问题 我正在尝试创建一个数据透视表 从第一季度开始 在同一张表中包含一系列数据 第一个 if 语句在那里是因为最后一列并不总是包含标题 所以我将其包含在那里 我希望范围是动态的 因为所制作的表格的大小将根据工作表中数
  • 使用“Openxml writer”合并 Excel 中的单元格

    我想合并单元格是excel 通过使用 DOM 方法 我可以轻松做到这一点 但由于我的 Excel 文件太大 当我尝试获取工作表时 它会抛出内存不足异常 所以我必须使用SAX方法来读取excel文件 但我不知道如何用这种方法合并单元格 查了很
  • 在工作表中合并行和求和值

    我有一个 Excel 工作表 其中包含以下数据 管道 来分隔列 A B C X 50 60 D E F X 40 30 A B C X 10 20 A B C Y 20 20 A B C X 20 70 D E F X 10 50 A B
  • 在Excel VBA中将图像(jpg)转换为base64?

    我需要在 Excel 中转换图像 或通过VBA 转为base64 最后我将进行XML输出 我怎样才能做到这一点 我需要引用 DOM 吗 我一直在读书这个问题 https stackoverflow com questions 169907
  • Excel - 公式或宏根据链接到另一个单元格的另一个单元格填充单元格

    在 Excel 中 我试图根据其他两个单元格中包含的值创建一个单元格 我需要单元格 X 和 Y 来获取基于单元格 L 和 的数据 就像这样 X Y L 1 2 3 4 5 6 A 6 1 1 6 1 6 1 7 1 7 2 7 2 8 1
  • Excel 2007 从 C# get_Value 始终返回 -2146826265

    我有一个引用 Microsoft Excel 12 0 对象库的小型 C 应用程序 除此之外 它还从 Excel 单元格读取值 它从一些较旧的 Excel xls 文件和一些 2007 文件 xlsx 中读取此值 所有 xls 文件的值都会
  • Java BigInteger bitLength() 方法忽略前导 0 位

    Java jre1 8 0 45 我完成了椭圆曲线类的调试 并在记录密钥的所有特征时 我还记录了密钥的位长度 对于椭圆曲线 其位长度并不总是偶数 我通过 BigInteger 显示密钥的位长度 ECPrivateKey oPK genera
  • HMC SHA1 哈希 - C# 生成与 Ruby 不同的哈希输出

    我正在尝试为我正在使用的第三方服务快速获取一个有缺陷的 Net 客户端库 原始库 可以运行 是用 Ruby 编写的 但 DotNet 的等效库会向 Ruby 库生成不同的哈希输出 Ruby加密代码如下 def self encrypt st
  • 使用 LAMBDA 在 Excel 中生成所有排列

    这是一个经常被问到和回答的问题 如何在 Excel 中生成所有排列 2011 https stackoverflow com questions 5724373 permutations in excel 2016 https stacko
  • 在 Python 中从 Excel 复制 YEARFRAC() 函数

    因此 我使用 python 来自动执行一些必须在 Excel 中执行的重复任务 我需要做的计算之一需要使用yearfrac 这在Python中被复制了吗 I found this https lists oasis open org arc
  • 从Excel单元格中提取固定长度的数字

    一些类似名称的线程 但仍然无法解决我的问题 我需要从 Excel 字符串中提取固定长度的 NUMBER 值 在我的场景中为 8 位数字 为此目的提供了以下 Excel 公式 MID A1 FIND SUBSTITUTE SUBSTITUTE
  • 使用 Excel VBA 循环工作簿文件夹并将所有工作表导出为制表符分隔文本

    我拼凑了一个 Excel VBA 脚本 该脚本将打开的工作簿中的所有工作表写入单独的制表符分隔文件 这仍然是 宏 吗 我正在 Excel 真空中学习这一点 它一次只处理一本工作簿 效果很好 这里是 Sub exportSheetsToTex
  • 如何获取活跃的Excel实例?

    我有一个 C 应用程序 该应用程序根据用户需求将信息粘贴到 excel 背后的逻辑是这样的 如果没有正在运行的 excel 实例 它会创建一个实例并粘贴到该实例 如果只有一个实例在运行 它会尝试获取该实例并使用它 这是我用来执行此操作的代码
  • VBA将二进制图像转换为网页的base64编码字符串

    我正在尝试读取 JPG 文件并将该文件转换为 base64 编码的字符串 该字符串可用作网页上的嵌入 jpeg 我在网上发现了两个在 VBA 中进行 Base64 编码 解码的函数 它们似乎被广泛接受 编码 解码过程产生了我的原始二进制字符
  • AES 128 CBC 蒙特卡罗测试

    我正在 AES 128 CBC 上执行 MCT 如中所述http csrc nist gov groups STM cavp documents aes AESAVS pdf http csrc nist gov groups STM ca
  • 溢出范围:将数组转换为与 @ 的交集值

    在 Excel 引入溢出范围之前 在 运算符 可以使用 将范围 转换 为单个值0 数值 或 字符串 但 并不完全相同 假设有一列正整数从B4向南 从D2向东有一行正整数 并且 A 列和 C 列以及第 1 行和第 3 行完全是空的 目的是将单
  • 从 Excel 应用程序对象中查找位数(32 位/64 位)?

    是否可以从 Microsoft Office Interop Excel ApplicationClass 确定 Excel 是以 32 位还是 64 位运行 Edit该解决方案应该适用于 Excel 2010 和 Excel 2007 此

随机推荐