如何手动解密 EncryptedAssertion

2024-03-01

我想解密 EncryptedAssertion。我尝试使用 OpenSaml Decrypter,但它对我不起作用。我无法解密 EncryptedData 我已经问过这个问题了——EncryptedAssertion 解密失败 https://stackoverflow.com/questions/48654932/saml-encryptedassertion-decryption-failing

当我等待任何解决方案时,我尝试手动解密它。它是一种混合加密

我尝试了下面的代码

CipherValue cv = encryptedAssertion.getEncryptedData().getKeyInfo().getEncryptedKeys().get(0).getCipherData().getCipherValue();
String cvalue = cv.getValue();
Cipher cipher = Cipher.getInstance("RSA");
cipher.init(Cipher.DECRYPT_MODE, getPrivateKey());
String decryptedValue = new String(cipher.doFinal(DatatypeConverter.parseBase64Binary(cvalue)));

我不确定我是否走在正确的道路上,但上面的解密值是我的加密数据的解密密钥。此解密值不是可读格式。不知道下一步该怎么做。

获取私钥方法

   public PrivateKey getPrivateKey(){
    Key key = null;
    PrivateKey privateKey = null;
    try {
        KeyStore ks = KeyStore.getInstance("pkcs12", "SunJSSE");         
        ks.load(new FileInputStream("prvkey.pfx"),"".toCharArray());
         Enumeration<String> aliases = ks.aliases();
         while(aliases.hasMoreElements()){
             String alias = aliases.nextElement();
             key  = ks.getKey(alias, "".toCharArray());
             privateKey = (PrivateKey)key; 
        }

} catch (Exception e) {
    e.printStackTrace();
} 
}

基于我的建议,如下所示。不确定我是否做对了,我也遇到了错误

 `CipherValue cv = encryptedAssertion.getEncryptedData().getKeyInfo().getEncryptedKeys().get(0).getCipherData().getCipherValue(); 
String cvalue = cv.getValue();
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
cipher.init(Cipher.UNWRAP_MODE, getPrivateKey());
Key decryptionKey = cipher.unwrap(DatatypeConverter.parseBase64Binary(cvalue), "RSA/ECB/PKCS1Padding", Cipher.SECRET_KEY);

CipherValue cdata = encryptedAssertion.getEncryptedData().getCipherData().getCipherValue();
String cdataValue = cdata.getValue();

byte[] iv = new byte[256 / 16];
IvParameterSpec ivParamSpec = new IvParameterSpec(iv);              
Cipher cipher2 = Cipher.getInstance("AES/CBC/PKCS5PADDING");
SecretKeySpec spec = new SecretKeySpec(decryptionKey.getEncoded(), "AES"); 
cipher2.init(Cipher.DECRYPT_MODE, spec, ivParamSpec );
String decryptedValue = new String(cipher2.doFinal(DatatypeConverter.parseBase64Binary(cdataValue)));`

Error -

Exception in thread "main" javax.crypto.BadPaddingException: Given final block not properly padded
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:966)
at com.sun.crypto.provider.CipherCore.doFinal(CipherCore.java:824)
at com.sun.crypto.provider.AESCipher.engineDoFinal(AESCipher.java:436)
at javax.crypto.Cipher.doFinal(Cipher.java:2121)

更新 :: 希望我根据评论做得正确。

byte[] iv = new byte[256/16];
iv = Arrays.copyOfRange(DatatypeConverter.parseBase64Binary(cdataValue), 0,  16);
byte[] cipherBlock = Arrays.copyOfRange(DatatypeConverter.parseBase64Binary(cdataValue), 16,  DatatypeConverter.parseBase64Binary(cdataValue).length);

IvParameterSpec ivParamSpec = new IvParameterSpec(iv);              
Cipher cipher2 = Cipher.getInstance("AES/CBC/PKCS5PADDING");
SecretKeySpec spec = new SecretKeySpec(decryptionKey.getEncoded(), "AES");
cipher2.init(Cipher.DECRYPT_MODE, spec, ivParamSpec );
String decryptedValue = new String(cipher2.doFinal(cipherBlock)); // Same error - Given final block not properly padded

我不会为您提供完整的答案,但我希望能让您走上正轨

您不应该只是简单地使用私钥解密该值。

首先使用 RSA/ECB/PKCS1Padding(根据提供的 saml 片段)解密 KeyInfo 值(解开 aes 密钥)

它应该为您提供一个 256 位(32 字节)随机密钥,用于加密数据本身

然后使用 AES 密钥解密数据。请注意,第一个字节(128 位/16 字节,aes 块大小)用作 IV。

进一步阅读

  • https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#sec-Processing-Encryption https://www.w3.org/TR/2002/REC-xmlenc-core-20021210/Overview.html#sec-Processing-Encryption
  • https://gusto77.wordpress.com/2017/10/30/cryption-reference-project/ https://gusto77.wordpress.com/2017/10/30/encryption-reference-project/
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何手动解密 EncryptedAssertion 的相关文章

随机推荐

  • 如何正确使用深层对象图和许多依赖项进行手动 DI

    我相信这个问题已经以某种或其他方式被问到 但我还没有得到它 我们做了一个 GWT 项目 但我的项目负责人不允许使用 GIN Guice 作为 DI 框架 他认为新程序员不会理解它 所以我尝试手动进行 DI 现在我遇到了深层对象图的问题 UI
  • 什么是加载外部资源的 HTML 元素列表? (HTML 电子邮件)

    我正在寻找一个可以加载外部资源的元素列表 因为不允许通过 JavaScript 进行额外的 DOM 操作 我正在尝试使用 HTML 查看器托管来自第三方的电子邮件 当发生这种情况时 我需要删除自动加载的所有资源 以便仅显示基本 HTML 即
  • 安卓用户代理

    我正在 Android 中编写一个应用程序 它使用 WebView 来显示 HTML 内容 我被告知要为我的应用程序获取 Android 用户代理 我该怎么做 我打开了http whatsmyuseragent com http whats
  • R 中 dplyr 中的“添加缺失的分组变量”消息

    我的脚本的一部分以前运行良好 但最近生成了一个奇怪的语句 之后我的许多其他函数都无法正常工作 我试图在每个站点的值排名列表中选择第 8 个和第 23 个位置 以查找每个站点 30 年来每年每天的第 25 个和第 75 个百分位值 我的方法如
  • TensorFlow教程中的next_batchbatch_xs,batch_ys = mnist.train.next_batch(100)来自哪里?

    我正在尝试 TensorFlow 教程 但不明白这一行中的 next batch 来自哪里 batch xs batch ys mnist train next batch 100 我在看 from tensorflow examples
  • Android 中如何读取文本文件? [复制]

    这个问题在这里已经有答案了 我将详细信息保存在 out txt 文件中 该文件已在 data data new android files out txt 中创建了一个文本文件 我可以将信息附加到文本中 但是我无法读取该文件 我使用以下过程
  • 无法在 Android 上选择多个图像上传 - Chrome 网络浏览器

    我想创建一个网络应用程序 用户可以从手机的图片库中选择并上传多个图像 这个功能在iOS上运行良好 但在Android上似乎被破坏了
  • JBoss 4:在哪里部署全局过滤器?

    我想使用 全局 HTTP 过滤器 因此 我编辑了deploy jboss web deployer conf web xml并补充道
  • 模拟Winforms按钮点击动画

    我有一个按钮 按钮内有一个图像控件 当用户单击图像时 我想为按钮设置动画 以便看起来按钮被按下 我并不真正关心实际的按钮按下事件是否触发 这是我想看到的按钮按下的幻觉 注意 我在网上看到的唯一选项涉及直接写入 Windows API 我真的
  • 如何根据简单的多边形绘制图像?

    我想将一个大致矩形区域复制到一个矩形区域 例子 两个区域均由其角点定义 保持大体方向 不翻转等 简单地旋转源图像是行不通的 因为相对边的长度可能不同 到目前为止 我发现没有办法在纯 C 中做到这一点 手动像素复制除外 所以我想我必须求助于
  • 在java中创建指定名称的临时文件

    我有一个 Byte 数组 我想将其内容放入临时文件中 我尝试这样做 try tempFile File createTempFile tmp null FileOutputStream fos new FileOutputStream te
  • 调试时从数据行获取所有列名/列值

    我正在创建一个数据行的模拟实例以进行测试 我尝试从数据库中复制的行包含 37 列 其中包含不同的变量 调试时是否有机会以干净的文本形式获取信息 以便简单地编辑我的模拟对象 我必须调整尼基尔的演员阵容 var colNames dr Tabl
  • 使用 C# 确定谁打开了文件

    使用 C 如何获取有关谁打开了文件的信息 用户名和机器名就足够了 以防万一 我有 Windows 工作站通过 Samba 访问 Linux 文件服务器上的文件 我在工作站上运行的程序中需要此信息 核心 NET 库没有任何方法可以做到这一点
  • 访问指针指向的整数数组时,“sizeof”对不完整类型“int[]”的无效应用

    我正在尝试学习 C 中的指针 并正在编写这个小整数数组指针练习 但遇到了无效的应用程序sizeof不完整类型int 问题 请告诉我哪里出了问题以及如何解决 谢谢 include
  • 在非标准位置安装带有库的 sf 包

    所需的库位于非标准位置 我可以通过以下命令安装 rgdal install packages rgdal type source configure args c with gdal config home programs anacond
  • 您会使用 实现轻量级 XML 解析器吗?

    如果您必须实现一个轻量级 XML 解析器 您会选择使用正则表达式吗 在我的例子中 XML 解析是最简单的 只有标签和文本内容 没有命名空间 没有属性 没有模式支持 当然是在一开始 但也许 我认为学习新的 C 0x 库对我来说是一个很好的练习
  • 将日期中的 NA 替换为另一个日期

    Data DB1 lt data frame orderItemID 1 10 orderDate c 2013 01 21 2013 03 31 2013 04 12 2013 06 01 2014 01 01 2014 02 19 20
  • WAMP服务器呈绿色但只得到404

    好吧 女士们先生们 我有一个很令人困惑的问题 我在工作中的 WIN7 机器上安装了 WAMP 服务器 一切都工作正常 有几个星期没有使用它 因为我被其他事情吸引了 有一天 我尝试启动它 图标是绿色的 我认为我们做得很好 然后我尝试打开 lo
  • 邮件脚本 - 解析错误:语法错误,意外的“=”[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在尝试从包含下拉列表的 html 表单设置一个简单的邮件脚本 但在声明所选变量的行上我收到一条错误消息 解析错误 语法错误 意外的 我
  • 如何手动解密 EncryptedAssertion

    我想解密 EncryptedAssertion 我尝试使用 OpenSaml Decrypter 但它对我不起作用 我无法解密 EncryptedData 我已经问过这个问题了 EncryptedAssertion 解密失败 https s