跨平台上的 AES cbc 填充加密/解密(.net c# 和代号 one bouncy castle)

2024-03-26

加密/解密不能在跨平台上工作。

我已使用此链接使用代号一内的充气城堡 AES 密码来加密/解密文本。

J2ME 中使用 Bouncycastle 进行 AES 加密/解密的示例 https://stackoverflow.com/questions/4243650/aes-encryption-decryption-with-bouncycastle-example-in-j2me?rq=1

在服务器端(.net),我使用此链接来实现相同的方法。

http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/ http://zenu.wordpress.com/2011/09/21/aes-128bit-cross-platform-java-and-c-encryption-compatibility/

现在我没有收到任何错误,但从代号加密的一个不会在服务器端完全解密,反之亦然。

请任何人帮我解决这个问题。

代号一中的代码:

import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoException;
import org.bouncycastle.crypto.engines.AESEngine;
import org.bouncycastle.crypto.modes.CBCBlockCipher;
import org.bouncycastle.crypto.paddings.PaddedBufferedBlockCipher;
import org.bouncycastle.crypto.params.KeyParameter;
import org.bouncycastle.crypto.params.ParametersWithIV;
import org.bouncycastle.util.encoders.Base64;


public class Test
{
    private static PaddedBufferedBlockCipher cipher = null;
    public static void main(String[] args)
    {
        try
        {
            byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8");
            byte[] iv = new byte[16];

            PaddedBufferedBlockCipher cipher = new PaddedBufferedBlockCipher(
                    new CBCBlockCipher(
                    new AESEngine()) );

            //Encryption
            String plainText = "Hello How are you !2#&*()% 123456@";
            byte[] plainData = plainText.getBytes("UTF-8");
            KeyParameter keyParam = new KeyParameter(key);
            CipherParameters ivAndKey = new ParametersWithIV(keyParam, iv);
            cipher.init(true, ivAndKey);
            byte[] ciptherBytes = cipherData(plainData); //48
            String cipherText = new String(Base64.encode(ciptherBytes), "UTF-8");//FileUtil.getStringFromByteArray(Base64.encode(ciptherBytes));


            System.out.println("encrypted >> "+cipherText);
            //Decryption

            byte[] cipherData = Base64.decode(cipherText);
            ivAndKey = new ParametersWithIV(keyParam, iv);
            cipher.init(false, ivAndKey);
            plainText = new String(cipherData(cipherData), "UTF-8");//FileUtil.getStringFromByteArray(cipherData(cipherData));

            System.out.println("decrypted >> "+plainText);


        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
    }
    private static byte[] cipherData(byte[] data)
            throws CryptoException
    {
        int minSize = cipher.getOutputSize(data.length);
        byte[] outBuf = new byte[minSize];
        int length1 = cipher.processBytes(data, 0, data.length, outBuf, 0);
        int length2 = cipher.doFinal(outBuf, length1);
        int actualLength = length1 + length2;
        byte[] result = new byte[actualLength];
        System.arraycopy(outBuf, 0, result, 0, result.length);
        return result;
    }

来自.net的代码:

 public static RijndaelManaged GetRijndaelManaged(String secretKey)
        {
            var keyBytes = new byte[16];
            var secretKeyBytes = Encoding.UTF8.GetBytes(secretKey);
            Array.Copy(secretKeyBytes, keyBytes, Math.Min(keyBytes.Length, secretKeyBytes.Length));
            return new RijndaelManaged
            {
                Mode = CipherMode.CBC,
                Padding = PaddingMode.PKCS7,
                KeySize = 128,
                BlockSize = 128,
                Key = keyBytes,
                IV = keyBytes
            };
        }

        public static byte[] EncryptCBC(byte[] plainBytes, RijndaelManaged rijndaelManaged)
        {
            return rijndaelManaged.CreateEncryptor()
                .TransformFinalBlock(plainBytes, 0, plainBytes.Length);
        }

        public static byte[] DecryptCBC(byte[] encryptedData, RijndaelManaged rijndaelManaged)
        {
            return rijndaelManaged.CreateDecryptor()
                .TransformFinalBlock(encryptedData, 0, encryptedData.Length);
        }

        public static String EncryptCBCStr(String plainText, String key)
        {
            var plainBytes = Encoding.UTF8.GetBytes(plainText);
            return Convert.ToBase64String(EncryptCBC(plainBytes, GetRijndaelManaged(key)));
        }

         public static String DecryptCBCStr(String encryptedText, String key)
        {
            var encryptedBytes = Convert.FromBase64String(encryptedText);
            return Encoding.UTF8.GetString(DecryptCBC(encryptedBytes, GetRijndaelManaged(key)));
        }

// call

var PlainText = "Hello How are you !2#&*()% 123456@";
var EncryptionKey = "MAKV2SPBNI992122";
var cypherCBC = EncryptCBCStr(PlainText, EncryptionKey);
var decryptCBC = DecryptCBCStr(cypherCBC, EncryptionKey);

提前致谢。


这个问题已经解决了......这只是密钥/IV字节问题。在.net中,当在java中我使用了不同的IV时,有相同的密钥和IV。

java代码修正:

而不是这个

byte key[] = "MAKV2SPBNI992122".getBytes("UTF-8");
byte[] iv = new byte[16];

用这个。

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

跨平台上的 AES cbc 填充加密/解密(.net c# 和代号 one bouncy castle) 的相关文章

随机推荐

  • 更改 ListView 阴影颜色和大小

    当 ListView 中的项目列表比 ListView 的大小长时 您会看到一个阴影 指示上方或下方有更多项目 默认情况下 该阴影是黑色的 这是不可取的 如果我将 cacheColorHint 设置为以下内容 android cacheCo
  • 调用布尔值的成员函数 fetchAll()

    我有以下问题 这个错误一直伴随着我 致命错误 未捕获错误 在 C xampp htdocs certificado functions php 49 中的布尔值上调用成员函数 fetchAll 堆栈跟踪 0 C xampp htdocs c
  • 在抽象方法上实现“after”装饰器

    我正在尝试编写一个抽象基类A它将有一个抽象方法run用户 开发人员预计会超载 我想强制执行一些 之后 行为自动应用于派生类B 这样之后B run 运行完毕后 将调用另一个标准方法 在数据管道中 这可以例如提交或回滚事务 有办法实现这一点吗
  • 用周围值的平均值替换缺失值

    我的数据集如下所示 我们称之为 a date value 2013 01 01 12 2 2013 01 02 NA 2013 01 03 NA 2013 01 04 16 8 2013 01 05 10 1 2013 01 06 NA 2
  • THREE.js 使用 DOMElements 的 SphereGeometry 全景热点

    我使用以下命令创建了一个简单的 WebGL 3D 全景应用程序SphereGeometry PerspectiveCamera and a CanvasTexture 现在 我希望通过在场景的某些部分添加 热点 来使场景栩栩如生Sphere
  • 为什么我的 takeWhile 无法与我的 Stream 配合使用

    以下代码打印 1 令人困惑的是 如果我删除评论 它会返回 4 这正是我所期望的 var max 0 lazy val list Stream Int 1 Stream from 2 list takeWhile x gt max x x l
  • 非常快速的 3D 距离检查?

    有没有一种方法可以进行快速而肮脏的 3D 距离检查 虽然结果很粗糙 但速度非常快 我需要进行深度排序 我用STLsort像这样 bool sortfunc CBox a CBox b return a gt Get3dDistance Pl
  • iPhone 音量已更改事件(音量已达到最大)

    我在用着 AudioSessionAddPropertyListener kAudioSessionProperty CurrentHardwareOutputVolume audioVolumeChangeListenerCallback
  • 如何按哈希值之一对哈希引用数组进行排序?

    首先 请原谅我生锈的 Perl 我正在尝试修改 Bugzilla 的 whine pl 以生成按严重性排序的错误列表 所以它给了我一个哈希引用数组 每个哈希值都包含有关特定错误的大量信息 ID 受让人 严重性等 我想按严重性对数组进行排序
  • 旧的 Firebase Analytics 事件报告发生了什么?

    最近的 Firebase 控制台更新后 无法找到按内容类型列出的 select content 事件的报告 以及按 item id 找到的选定内容类型的报告 我使用这些报告来研究我的应用程序行为 方法是记录它们 Analytics logE
  • 仅通过一个 SocketChannel 发送多条消息

    读完本教程后 http rox xmlrpc sourceforge net niotut http rox xmlrpc sourceforge net niotut 这是关于编写非阻塞服务器和客户端 我阅读了NIO部分 跳过了SSL部分
  • 根据帖子内容添加 WordPress 类别

    我正在开发一个 Wordpress 网站 用户可以登录该网站并发帖 我想为他们的帖子添加一些功能 基本上 我想为用户提供使用保留字符为帖子分配类别的功能 因此 如果用户发布 我正在学习 programming 该帖子将被分配到编程类别 在
  • CSS水平滚动

    我正在尝试创建一个 div 包含一系列只能水平滚动的照片 它应该看起来像这样LINK http cssdesk com L6Dsa 然而 上述只能通过指定宽度来实现 div 其中包含照片 因此它们不会 自动换行 如果我不设置宽度 它看起来像
  • Flask 在哪里寻找图像文件?

    我正在使用 Flask 设置本地服务器 我当前想要做的就是使用index html 页面中的img 标签显示图像 但我不断得到error GET http localhost 5000 ayrton senna movie wallpape
  • 无法解析 Android 上的 MapActivity 类

    我有一个包含 11 种不同活动的应用程序 这些活动之一是 MapActivity 的扩展 它是用于数据可视化的地图 要进入此活动 用户必须首先完成启动活动 然后完成其他 3 个活动 启动MapActivity的代码是 Intent i ne
  • 自定义对话框太小

    我有一个实现自定义对话框的 Android 活动 应用程序运行正常 但对话框太小 我想显示更大的对话框 我怎样才能实现这一点 这是我的布局 xml
  • 在 system() 函数中使用变量 C++

    string line ifstream myfile aaa txt getline myfile line system curl exe b cookie txt d test line http example com http e
  • 如何清除node js中清除浏览器cookie的req.session?

    我在用 express 4 14 0 with express session用于保存用户名 用户登录后 我会将用户名保存在req session authorizedUser username将其显示在应用程序标题中 当浏览器历史记录被清
  • Vim 中的任务标签

    关于任务标签的两个问题 Vim 中还提供哪些其他任务标签 例如 TODO 有没有办法像 Eclipse IDE 一样制作自定义任务标签 对于自定义标签 我在 vimrc 中使用以下内容 您应该能够根据您的需要进行调整 if has auto
  • 跨平台上的 AES cbc 填充加密/解密(.net c# 和代号 one bouncy castle)

    加密 解密不能在跨平台上工作 我已使用此链接使用代号一内的充气城堡 AES 密码来加密 解密文本 J2ME 中使用 Bouncycastle 进行 AES 加密 解密的示例 https stackoverflow com questions