Java:使用 Bouncy Castle 进行 PGP 加密

2024-03-08

我正在尝试使用 PGP 实现加密,并且我的加密方法成功加密了输入字符串,但是当我尝试解密它以验证加密是否正确完成时,该字符串不会被解密。

我尝试了两种方法:

第一种方法使用文件输出流编写加密字符串和第二种方法使用字节数组输出流. 文件输出流创建一个文件,我可以使用 Kleopatra 对其进行解密。然而我的要求是只获取一个加密的字符串(不写入文件中)。因此,当我尝试解密加密字符串(使用后收到字节数组输出流)它不工作。我尝试复制字符串并通过 Kleopatra 中的工具>>剪贴板解密它,但解密/验证选项被禁用。我尝试通过 FileWriter 类手动在文件上写入字符串,但解密失败并出现以下错误文件包含证书且无法解密或验证。

我假设只有由 OutputStream 直接创建的文件才能成功解密。 但我必须真正检查加密的字符串。

任何帮助将不胜感激。


以下完整示例取自《Java Cryptography:Tools and Techniques by David Hook & Jon Eaves》一书的源代码。 包含所有示例的完整源代码可在此处获取:https://www.bouncycastle.org/java-crypto-tools-src.zip https://www.bouncycastle.org/java-crypto-tools-src.zip

这些示例展示了使用 El Gamal 或椭圆曲线创建私钥/公钥以及使用 AES-256 加密。 在 ecExample-method 中,我添加了两行,将加密字符串保存到文件“pgp-encrypted-string.dat”中,然后 重新加载数据以解密文件并显示解密的字符串。

import org.bouncycastle.bcpg.SymmetricKeyAlgorithmTags;
import org.bouncycastle.jce.provider.BouncyCastleProvider;
import org.bouncycastle.openpgp.*;
import org.bouncycastle.openpgp.jcajce.JcaPGPObjectFactory;
import org.bouncycastle.openpgp.operator.PublicKeyDataDecryptorFactory;
import org.bouncycastle.openpgp.operator.jcajce.JcaPGPKeyPair;
import org.bouncycastle.openpgp.operator.jcajce.JcePGPDataEncryptorBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyDataDecryptorFactoryBuilder;
import org.bouncycastle.openpgp.operator.jcajce.JcePublicKeyKeyEncryptionMethodGenerator;
import org.bouncycastle.util.Strings;
import org.bouncycastle.util.io.Streams;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import java.security.Security;
import java.security.spec.ECGenParameterSpec;
import java.util.Date;

public class PGPEncryptionExampleForSO
{
     /**
     * Create an encrypted data blob using an AES-256 session key and the
     * passed in public key.
     *
     * @param encryptionKey the public key to use.
     * @param data the data to be encrypted.
     * @return a PGP binary encoded version of the encrypted data.
     */
    public static byte[] createEncryptedData(
        PGPPublicKey encryptionKey,
        byte[] data)
        throws PGPException, IOException
    {
        PGPEncryptedDataGenerator encGen = new PGPEncryptedDataGenerator(
            new JcePGPDataEncryptorBuilder(SymmetricKeyAlgorithmTags.AES_256)
                .setWithIntegrityPacket(true)
                .setSecureRandom(new SecureRandom()).setProvider("BC"));
        encGen.addMethod(
            new JcePublicKeyKeyEncryptionMethodGenerator(encryptionKey)
                .setProvider("BC"));
        ByteArrayOutputStream encOut = new ByteArrayOutputStream();
        // create an indefinite length encrypted stream
        OutputStream cOut = encGen.open(encOut, new byte[4096]);
        // write out the literal data
        PGPLiteralDataGenerator lData = new PGPLiteralDataGenerator();
        OutputStream pOut = lData.open(
            cOut, PGPLiteralData.BINARY,
            PGPLiteralData.CONSOLE, data.length, new Date());
        pOut.write(data);
        pOut.close();
        // finish the encryption
        cOut.close();
        return encOut.toByteArray();
    }

    /**
     * Extract the plain text data from the passed in encoding of PGP
     * encrypted data. The routine assumes the passed in private key
     * is the one that matches the first encrypted data object in the
     * encoding.
     *
     * @param privateKey the private key to decrypt the session key with.
     * @param pgpEncryptedData the encoding of the PGP encrypted data.
     * @return a byte array containing the decrypted data.
     */
    public static byte[] extractPlainTextData(
        PGPPrivateKey privateKey,
        byte[] pgpEncryptedData)
        throws PGPException, IOException
    {
        PGPObjectFactory pgpFact = new JcaPGPObjectFactory(pgpEncryptedData);
        PGPEncryptedDataList encList = (PGPEncryptedDataList)pgpFact.nextObject();
        // find the matching public key encrypted data packet.
        PGPPublicKeyEncryptedData encData = null;
        for (PGPEncryptedData pgpEnc: encList)
        {
            PGPPublicKeyEncryptedData pkEnc
                = (PGPPublicKeyEncryptedData)pgpEnc;
            if (pkEnc.getKeyID() == privateKey.getKeyID())
            {
                encData = pkEnc;
                break;
            }
        }
        if (encData == null)
        {
            throw new IllegalStateException("matching encrypted data not found");
        }
        // build decryptor factory
        PublicKeyDataDecryptorFactory dataDecryptorFactory =
            new JcePublicKeyDataDecryptorFactoryBuilder()
                .setProvider("BC")
                .build(privateKey);
        InputStream clear = encData.getDataStream(dataDecryptorFactory);
        byte[] literalData = Streams.readAll(clear);
        clear.close();
        // check data decrypts okay
        if (encData.verify())
        {
            // parse out literal data
            PGPObjectFactory litFact = new JcaPGPObjectFactory(literalData);
            PGPLiteralData litData = (PGPLiteralData)litFact.nextObject();
            byte[] data = Streams.readAll(litData.getInputStream());
            return data;
        }
        throw new IllegalStateException("modification check failed");
    }

    private static void elgamalExample()
        throws Exception
    {
        byte[] msg = Strings.toByteArray("Hello, world!");
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("DH", "BC");
        kpGen.initialize(2048);
        KeyPair kp = kpGen.generateKeyPair();
        PGPKeyPair elgKp = new JcaPGPKeyPair(
            PGPPublicKey.ELGAMAL_ENCRYPT, kp, new Date());
        byte[] encData = createEncryptedData(elgKp.getPublicKey(), msg);
        byte[] decData = extractPlainTextData(elgKp.getPrivateKey(), encData);
        System.out.println("elgamal encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
        System.out.println(Strings.fromByteArray(decData));
    }

    private static void ecExample()
        throws Exception
    {
        byte[] msg = Strings.toByteArray("Hello, world!");
        KeyPairGenerator kpGen = KeyPairGenerator.getInstance("EC", "BC");
        kpGen.initialize(new ECGenParameterSpec("P-256"));
        KeyPair kp = kpGen.generateKeyPair();
        PGPKeyPair ecdhKp = new JcaPGPKeyPair(PGPPublicKey.ECDH, kp, new Date());
        byte[] encData = createEncryptedData(ecdhKp.getPublicKey(), msg);
        // save encrypted string
        Files.write(Paths.get("pgp-encrypted-string.dat"), encData);
        // load encrypted string
        byte[] encDataLoad = Files.readAllBytes(Paths.get("pgp-encrypted-string.dat"));
        byte[] decData = extractPlainTextData(ecdhKp.getPrivateKey(), encDataLoad);
        System.out.println("ec encryption msg length: " + msg.length + " enc.length: " + encData.length + " dec.length: " + decData.length);
        System.out.println(Strings.fromByteArray(decData));
    }

    public static void main(String[] args)
        throws Exception
    {
        Security.addProvider(new BouncyCastleProvider());
        // you need the two files bcpg-jdk15on-165.jar and bcprov-jdk15to18-165.jar to run the example
        System.out.println("Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves");
        System.out.println("get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip");
        elgamalExample();
        ecExample();
    }
}

这是简短的输出:

Example from Java Cryptography: Tools and Techniques by David Hook & Jon Eaves
get source files: https://www.bouncycastle.org/java-crypto-tools-src.zip
elgamal encryption msg length: 13 enc.length: 601 dec.length: 13
Hello, world!
ec encryption msg length: 13 enc.length: 200 dec.length: 13
Hello, world!

Added:据我现在了解,你有一个像这样的字符串

This string needs an encryption

并且您想使用 rsa pgp 公钥对其进行加密:

-----BEGIN PGP PUBLIC KEY BLOCK-----
Version: BCPG v1.65

mI0EXr/nDgEEAKhB6ufAB954aBIlNjPCsryzUVLu0qkC/1RtnFHf+J6IVegV8Wi7
28V074inQcw6o6FTLtFTaLRP4+3eXNATdjGSjrvcP7k+nu50vydugHv43fPuCiZ7
6gbbMTE9gPiLPA2pS+SmQJnr9hOrD5rzwYP1yNNIsRJ9qmU5NeZyu+szABEBAAG0
DHRlc3RpZGVudGl0eYicBBABAgAGBQJev+cOAAoJEPBDuyqTbz/gY0YD/R+gDkfe
qPgNuk6iI2wLSGEeZRXr6Ru1cyG73CRvz7BjCpwWx039AdQzP9gkeo6MEj8Z0c73
obqEP8NtvvOcwC7+/QiGLTR2mgCsNhk54+iCGsvNbkpkr/rRoYZGyvb+rxui0A61
DCB1w5hdnyMg2OglFNrkaPfpNjMsTebfF5eS
=h1+m
-----END PGP PUBLIC KEY BLOCK-----

并获取加密后的字符串

-----BEGIN PGP MESSAGE-----
Version: BCPG v1.65

hIwD8EO7KpNvP+ABA/9JkOE9PDyS/kr/lZ1Uz+NCSe1JiNcKCXjbsUbvP8CT7Tf1
cKlgzIz1mQjdpkBtVpVhEnEjmUzFy2UCRKr4b4Wx7/1UL+370CICW5HgMoi5TgTg
MYRy5I9Uba/+JxcusjWB1JJHP4ofULziXRKLWAoSPLlglZDzSmV88hNo19rl39JZ
AbMhIS2edM9hHICefL/Yaiq90hGjKMRReVopu2tPUjNLGYP7QABAvWb3WQJMZoYT
HEsyjHxeyYQylAdYB7pWQA0++Z803iclvM3skN8FBt64ebDkqfxgbhs=
=je0r
-----END PGP MESSAGE-----

现在您想使用 Kleoptatra 在线解密此消息(例如https://sela.io/pgp-en/ https://sela.io/pgp-en/)或在 Java 中使用 RSA pgp 私钥和密码 123456:

-----BEGIN PGP PRIVATE KEY BLOCK-----
Version: BCPG v1.65

lQH+BF6/5w4BBACoQernwAfeeGgSJTYzwrK8s1FS7tKpAv9UbZxR3/ieiFXoFfFo
u9vFdO+Ip0HMOqOhUy7RU2i0T+Pt3lzQE3Yxko673D+5Pp7udL8nboB7+N3z7gom
e+oG2zExPYD4izwNqUvkpkCZ6/YTqw+a88GD9cjTSLESfaplOTXmcrvrMwARAQAB
/gMDAhhcE1oF/u8YYExKGLgriK5JpUUSsMFU0AOHP9/zZQr09437V0f/F4J87+9s
G30lDRikGwynEGRnAvIVwqq2F+iarKGGHCZCRgbyufXS7VK6wE/43lR0kSwA2VIM
ll/KbQKP1cSZv0rqtJ1tGL7cDHFEwq10gM4Bn75HOKyBzE9oERRKz37noAECsAZn
xuXGlEB5noqTT00RxsHjBA5Os04CtEz9N+OMrg47IR7AzSQUe90lG2F6W71dhJ6V
jQaf7D6JFU3dOWPW1eBb5FQhgYF92CFRizJ42lDCiTfl2FQU49MlwLd2ofNneuPo
aVuPoYUNKwbasyx4fo2vh6rrMyxmncCizMExvh6GIVgYd7EK9s6Gxq/duuOvly4O
ZAyIY2MOon0bDXxAYR2q/wdQLamnP7rAR4uMu24m/iOuBj6wwTR8v8hhsFFTp/4u
tebwWzLnPyyBYStnTF5IZ9ZJeVl5S3zdzNcrP9g8yXtItAx0ZXN0aWRlbnRpdHmI
nAQQAQIABgUCXr/nDgAKCRDwQ7sqk28/4GNGA/0foA5H3qj4DbpOoiNsC0hhHmUV
6+kbtXMhu9wkb8+wYwqcFsdN/QHUMz/YJHqOjBI/GdHO96G6hD/Dbb7znMAu/v0I
hi00dpoArDYZOePoghrLzW5KZK/60aGGRsr2/q8botAOtQwgdcOYXZ8jINjoJRTa
5Gj36TYzLE3m3xeXkg==
=y/tQ
-----END PGP PRIVATE KEY BLOCK-----

并获取解密后的字符串:

This string needs an encryption

幸运的是,要使用 Java 进行加密/解密,BouncyCastle Github-Repo 中提供了示例文件:https://github.com/bcgit/bc-java/blob/master/pg/src/main/java/org/bouncycastle/openpgp/examples/ https://github.com/bcgit/bc-java/blob/master/pg/src/main/java/org/bouncycastle/openpgp/examples/。您可能需要使用 RSA (RSAKeyPairGenerator.java) 或 ElGamal 创建新的 PGP 密钥对 (DSAElGamalKeyRingGenerator.java)。使用生成的密钥,您可以使用 KeyBasedFileProcessor.java 和必要的 PGPExampleUtil.java 进行加密或解密。

我使用“-a testidentity 123456”作为参数创建了 RSA 密钥文件,加密是使用“-e -ai plaintext.txt rsa_pub.asc”完成的,解密是使用“-d plaintext.txt.asc rsa_secret.asc 123456 ”。

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

Java:使用 Bouncy Castle 进行 PGP 加密 的相关文章

  • 在 Spark 中写入 JSON 时保留具有空值的键

    我正在尝试使用 Spark 编写 JSON 文件 有一些键有null作为价值 这些在中显示得很好DataSet 但是当我写入文件时 密钥会丢失 我如何确保它们被保留 写入文件的代码 ddp coalesce 20 write mode ov
  • Java 比 Xmx 参数消耗更多内存

    我有一个非常简单的 Web 服务器类 基于 Java SEHttpServer class 当我使用此命令启动编译的类来限制内存使用时 java Xmx5m Xss5m Xrs Xint Xbatch Test 现在如果我使用检查内存top
  • 如何确定 JDialog 显示在哪个屏幕上

    我有一个非常大的应用程序 有多个对话框 我的任务是确保不完全可见的对话框 因为用户将其从可见屏幕区域拉出 移回屏幕中心 当我只处理一个屏幕时 这没问题 它工作得很好 但是 该应用程序的大多数用户的桌面上都有两个屏幕 当我尝试找出对话框显示在
  • 在 alpine / Jprofile 10 中运行 jpenable 时出现 UnsatisfiedLinkError

    当运行 jpenable 以允许在运行 JDK 8 的 alpine 3 3 容器中对 Jprofiler10 进行分析时 我收到 UnsatisfiedLinkError 异常 有任何想法吗 ERROR The agent could n
  • Android Fabric Crashlytics 崩溃,初始化时未找到资源

    我从 google play 控制台收到了这份报告 看起来 Fabric 在启动时崩溃了 因为某些用户出现了资源未找到的异常 java lang RuntimeException at android app ActivityThread
  • 如何在 SpringBoot v3.0.0 中使用嵌入式 MongoDB?

    我正在尝试连接嵌入式 mongodb 并使用 MongoDbSpringIntegrationTest 对其进行测试 问题是相同的代码在 2 7 7 中适用于 spring boot 但在 3 0 0 中不适用于 spring boot 问
  • Hibernate更新查询问题

    对于此更新查询 update TestDB dbo MyEmp set empname where empid 我在 DAO 课上写的 MyEmployee myEmployee new MyEmployee MyEmployee myEm
  • 覆盖乔达一周的第一天?

    是否有可能覆盖乔达弱的第一天sunday 因为 Joda 使用Monday作为一周的第一天 如果有办法的话 谁能解释一下 我在 SOF 中提到了以下主题 乔达时间 一周的第一天 https stackoverflow com questio
  • 相对重力

    我最近开始使用jMonkey引擎 这非常好 但我在尝试实现相对重力时陷入了困境 我想让行星彼此围绕轨道运行 不一定是完美的圆形轨道 取决于速度 所以每个对象都应该影响其他对象 我现在拥有的 关闭全球重力 bulletAppState get
  • java springrabbit - 优雅地拒绝消息

    我有以下侦听器方法 Override public void onMessage Message message Channel channel try do something bad catch Exception e try long
  • 是否有适用于 Java 的 CalDAV 客户端库? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 CalDAV 协议与我的日
  • SFTP Java - 管道关闭 Jsch 异常

    我正在研究一种 java 方法 将文件从一个位置复制到另一个远程位置 我的代码如下 我尝试使用jsch 0 1 42 0 1 50 0 1 54 public static void processFiles ArrayList
  • mysql 准备好的语句错误:MySQLSyntaxErrorException

    我使用准备好的语句编写了选择语句 每次尝试运行都会出现此错误 我如何克服这个错误 我的jdbc连接器是mysql connector java 5 1 13 bin jar 我的代码 public Main add ad to getAdD
  • Spring Boot 中的服务限流能力

    有什么办法可以实现Spring中其余服务的服务限制能力 特别是Spring boot 这里的期望是 我的服务暴露于外界 目前每秒 分钟的服务调用数量没有限制 我们希望通过设置限制来控制这一点 我有一个替代选项 通过跟踪并发哈希映射或任何缓存
  • 如何让 Camel FTP 按需只获取一次

    我对骆驼还很陌生 我一直在尝试让 Camel 根据需要仅通过 FTP 获取单个文件一次 我无法让它发挥作用 这是我尝试过的 让我知道什么是最好的方法以及我的代码有什么问题 1 读取文件后发送一条空消息当收到空消息时 停止路由 from di
  • 如何使用 python-gnupg 加密大型数据集而不占用所有内存?

    我的磁盘上有一个非常大的文本文件 假设它是 1 GB 或更多 还假设该文件中的数据有 n每 120 个字符一个字符 我在用python gnupg https pythonhosted org python gnupg 对此文件进行加密 由
  • 为什么找不到 getservletcontext?

    我正在尝试使用getServletContext getRealPath 但我不断收到此错误 cannot find symbol symbol method getServletContext location interface jav
  • Java无损保存原始JPEG

    如下所示 我有第一张图像是原始 JPEG 图像 第二张图像用于缓冲图像 然后使用保存http www lac inpe br JIPCookbook 6040 howto compressimages jsp http www lac in
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • Bootbox.confirm可以同步工作吗?

    在aspx页面中 有一个像这样的asp linkbutton
  • 是否可以编写一个 Rust 宏“has_trait!(,|)”?

    我想匹配 例如一个ident的类型来实现某种特征 我该怎么做 这是 不完整 代码的基本思想 macro rules has trait t ty x ident gt fn trait test let a vec 1 2 3 let b
  • 如何从Python中的请求模块中完全删除任何日志记录

    如何从 Python 中的 requests 模块中完全删除任何日志记录 我什至不需要设置 临界 级别 像这样 import logging requests log logging getLogger requests requests
  • 如何使用一个查询获取包含子列表的列表?

    我想打印数据库表中的项目列表 并与每个项目一起打印一个相关子项目的小列表 最多 10 个项目 例如 我有这两个表 ITEMS id integer name string SUBITEMS id integer name string it
  • 如何输出带双引号的字符串?

    我需要输出一个字符串 它基本上是一个java代码 我有这样的事情 web if url contains mp4 我需要单引号 将是双引号 而不是在 html 代码中 有可能做到吗 new str str replace web 您可以选择
  • 防止其他人强制推送到我的 Git 存储库

    有没有办法阻止除了我之外的任何人强制推送到我的 Git 存储库之一 特别是在 Github 中 据我了解 受保护的分支可以完全防止强制推送 但只要我是这样做的人就可以了 每当 GitHub 存储库出现保护问题时 最可靠的强制执行方法就是拥有
  • 如果 CDN 失败,jquery-tools 会回退

    如果 Google 的 CDN 失败 我将使用 来回退并在本地提供 jquery 如下这个线程 https stackoverflow com questions 1014203 best way to use googles hosted
  • 基于容器元素在 AngularJS 指令内自动调整 SVG 大小

    我将一个角度指令放置在动态大小的元素内 该指令本身由一个基于元素大小计算的 SVG 组成 我正在尝试使 SVG 根据容器的大小自动调整大小和重绘 我最初尝试过这样的事情 我的指令 js angular module myModule dir
  • “foreach”是否会导致 Linq 重复执行?

    我第一次使用 NET 中的实体框架 并且一直在编写 LINQ 查询以便从我的模型中获取信息 我想从一开始就养成良好的编程习惯 因此我一直在研究编写这些查询并获取结果的最佳方法 不幸的是 在浏览 Stack Exchange 时 我似乎遇到了
  • 从 Geany 运行 Node.js 服务器

    一个简单的问题 是否可以配置 Geany IDE 以便可以使用 运行 按钮直接从 Geany 运行 Node js 服务器 当在 JS 文件中时 转到Build gt Set Build Commands 应该有一个章节标题Execute
  • KnockoutJS:如何将一个 observableArray 添加到另一个 observableArray?

    我想将选择元素中的选定选项添加到绑定表中 视图模型具有 addItem 函数 该函数使用 ko utils arrayPushAll 将 selectedItems 数组添加到 linkedItems 数组中 但是当我单击 添加 按钮 调用
  • 按字母顺序对对象数组进行排序

    我正在尝试按字母顺序对对象数组进行排序 为了使事情简单 我使用下面的示例 在我的打字稿中 我通过拼接来插入和删除数组对象中的项目 Array cars id 1 items name car1 description this is car
  • 如何使用 Rijndael 在 iOS 中加密 C# 中的解密字符串

    我正在尝试使用 Objective C 和 C 加密和解密字符串 两者在本机代码中都工作正常 但是当我尝试解密 C 中的字符串时 它在 iOS 中被加密 我收到一些错误 这是我在目标c中使用的代码 NSData AES256EncryptW
  • javascript 在 onload 中选择文本区域中的文本

    使用 JavaScript 加载页面时 如何自动选择文本区域中的文本 JSFiddle 演示 http jsfiddle net kjy112 V85mC 你可以这样做 HTML
  • 将文件夹的多个 csv 文件加载到一个数据框中

    我有多个 csv 文件保存在一个具有相同列布局的文件夹中 并希望将其作为 pandas 中的数据框加载到 python 中 这个问题确实与此类似thread https stackoverflow com questions 3833052
  • dequeueReusableCellWithIdentifier:forIndexPath 中断言失败:

    所以我正在为我的学校制作一个RSS阅读器并完成代码 我运行了测试 它给了我这个错误 这是它所引用的代码 UITableViewCell tableView UITableView tableView cellForRowAtIndexPat
  • Magento FPC Cache Warm 与用户组、wget、Lesti FPC

    我在 Magento 网站上使用 Lesti FPC 该网站有 10 个客户组和很多类别 产品 我创建了一个 shell 脚本 它会在一夜之间读取 sitemap xml 和 wget 的每个 url 以构建站点的缓存 这对于访客来说非常有
  • 不带 SQL 的 ContentProvider

    我有两条数据需要从外部应用程序访问并存储 根据文档 ContentProviders 是唯一可能的方式 但它也提到了外部存储 ContentProviders 实现了一个类似数据库的 接口 对于两条数据来说使用数据库是非常不必要的 我宁愿将
  • 如何将 XMLGregorianCalendar 与仅日期部分(日、月、年)进行比较?

    我正在开发一个与 spring struts Web 应用程序集成的 Web 服务 在 XSD 中有一个 XMLGregorianCalendar 类型属性 假设属性名称是trxDate 在 SOAPUI 测试应用程序中 如果我使用以下命令
  • Java:使用 Bouncy Castle 进行 PGP 加密

    我正在尝试使用 PGP 实现加密 并且我的加密方法成功加密了输入字符串 但是当我尝试解密它以验证加密是否正确完成时 该字符串不会被解密 我尝试了两种方法 第一种方法使用文件输出流编写加密字符串和第二种方法使用字节数组输出流 文件输出流创建一