首页 > 编程语言 >用C#写一个上传下载文件至OSS后返回文件路径用DES加密解密

用C#写一个上传下载文件至OSS后返回文件路径用DES加密解密

时间:2023-04-21 17:36:30浏览次数:44  
标签:文件 string C# OSS DES var using byte

废话不多说,直接上代码:

using Aliyun.OSS; // 引入阿里云 OSS SDK
using System;
using System.IO;
using System.Security.Cryptography; // 引入 .NET Framework 中的加密库
using System.Text;

public class OSSHelper
{
    /// <summary>
    /// 将文件上传至 OSS,并使用 DES 算法加密返回的文件 URL
    /// </summary>
    /// <param name="accessKeyId">阿里云授权 Access Key Id</param>
    /// <param name="accessKeySecret">阿里云授权 Access Key Secret</param>
    /// <param name="endpoint">OSS 服务域名</param>
    /// <param name="bucketName">Bucket 名称</param>
    /// <param name="objectKey">Object Key,即在 OSS 上的文件名称</param>
    /// <param name="filePath">待上传的文件本地路径</param>
    /// <param name="desKey">DES 密钥</param>
    /// <param name="desIV">DES 向量</param>
    /// <returns>加密后的文件 URL</returns>
    public static string UploadFileToOSS(string accessKeyId, string accessKeySecret, string endpoint, string bucketName, string objectKey, string filePath, byte[] desKey, byte[] desIV)
    {
        // 创建 OSS 客户端
        var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

        // 上传文件
        using (var fs = new FileStream(filePath, FileMode.Open))
        {
            client.PutObject(bucketName, objectKey, fs);
        }

        // 返回加密后的文件路径
        return EncryptString($"http://{bucketName}.{endpoint}/{objectKey}", desKey, desIV);
    }

    /// <summary>
    /// 从 OSS 上下载指定的文件,并使用 DES 算法解密文件 URL
    /// </summary>
    /// <param name="accessKeyId">阿里云授权 Access Key Id</param>
    /// <param name="accessKeySecret">阿里云授权 Access Key Secret</param>
    /// <param name="endpoint">OSS 服务域名</param>
    /// <param name="bucketName">Bucket 名称</param>
    /// <param name="objectKey">Object Key,即在 OSS 上的文件名称</param>
    /// <param name="downloadPath">下载文件保存的本地路径</param>
    /// <param name="desKey">DES 密钥</param>
    /// <param name="desIV">DES 向量</param>
    public static void DownloadFileFromOSS(string accessKeyId, string accessKeySecret, string endpoint, string bucketName, string objectKey, string downloadPath, byte[] desKey, byte[] desIV)
    {
        // 创建 OSS 客户端
        var client = new OssClient(endpoint, accessKeyId, accessKeySecret);

        // 下载文件
        var obj = client.GetObject(bucketName, objectKey);
        using (var fs = new FileStream(downloadPath, FileMode.Create))
        {
            int length = 4 * 1024;
            var buffer = new byte[length];
            var bytesRead = obj.Content.Read(buffer, 0, length);
            while (bytesRead > 0)
            {
                fs.Write(buffer, 0, bytesRead);
                bytesRead = obj.Content.Read(buffer, 0, length);
            }
        }

        // 解密文件路径并输出
        var decryptedUrl = DecryptString($"http://{bucketName}.{endpoint}/{objectKey}", desKey, desIV);
        Console.WriteLine(decryptedUrl);
    }

    /// <summary>
    /// 使用 DES 算法加密字符串
    /// </summary>
    /// <param name="plainText">待加密的字符串</param>
    /// <param name="key">DES 密钥(长度为 8)</param>
    /// <param name="iv">DES 向量(长度为 8)</param>
    /// <returns>加密后的字符串</returns>
    public static string EncryptString(string plainText, byte[] key, byte[] iv)
    {
        byte[] encrypted;
        using (var des = DES.Create())
        {
            des.Key = key;
            des.IV = iv;
            var inputBuffer = Encoding.UTF8.GetBytes(plainText);
            encrypted = des.CreateEncryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
        }
        return Convert.ToBase64String(encrypted);
    }

    /// <summary>
    /// 使用 DES 算法解密字符串
    /// </summary>
    /// <param name="cipherText">待解密的字符串</param>
    /// <param name="key">DES 密钥(长度为 8)</param>
    /// <param name="iv">DES 向量(长度为 8)</param>
    /// <returns>解密后的字符串</returns>
    public static string DecryptString(string cipherText, byte[] key, byte[] iv)
    {
        byte[] decrypted;
        using (var des = DES.Create())
        {
            des.Key = key;
            des.IV = iv;
            var inputBuffer = Convert.FromBase64String(cipherText);
            decrypted = des.CreateDecryptor().TransformFinalBlock(inputBuffer, 0, inputBuffer.Length);
        }
        return Encoding.UTF8.GetString(decrypted);
    }
}

//    在完成了上述代码之后,我们可以按照以下方式调用这些方法:
//// 定义加密所使用的 DES 密钥和向量
//byte[] desKey = Encoding.ASCII.GetBytes("01234567");
//    byte[] desIV = Encoding.ASCII.GetBytes("abcdefgh");

//    // 调用上传文件至 OSS 并加密返回 URL 的方法
//    string encryptedUrl = OSSHelper.UploadFileToOSS("your-access-key-id", "your-access-key-secret", "your-endpoint", "your-bucket-name", "test.txt", "C:\\test.txt", desKey, desIV);
//    Console.WriteLine(encryptedUrl);

//// 调用从 OSS 下载文件并解密 URL 的方法
//OSSHelper.DownloadFileFromOSS("your-access-key-id", "your-access-key-secret", "your-endpoint", "your-bucket-name", "test.txt", "C:\\download.txt", desKey, desIV);
View Code

 

标签:文件,string,C#,OSS,DES,var,using,byte
From: https://www.cnblogs.com/wxsdyz/p/17341163.html

相关文章

  • JDBC--API--Statement
    importjava.sql.Connection;importjava.sql.DriverManager;importjava.sql.SQLException;importjava.sql.Statement;publicclassjdbcdemo_Statement{publicstaticvoidmain(String[]args)throwsClassNotFoundException,SQLException{Class.forName......
  • Spring cloud:开发接口
    @RequestBody支持json格式,前端传过来某类型的数据,后端直接可以用@RequestParam?id=1此类传参,有时候会导致类型不能转换错误例如,前端页面分页,传过来的page、size,在地址栏显示,路径后?id=xx ,两个数据明显是int,如果用了@RequestParam接收多个参数后端以Map接收,不能直接接收,且报类型......
  • spring boot、cloud -yml:显示/show SQL
    logging:level:com.zking.zkingOAS.FDadmin.mapper:debug在控制台显示业务具体执行的SQL,且有参数说明、有多少数据 application.properties:logging.level.com.wochat.mapper=debug ......
  • CSS 基础拾遗(核心知识、常见需求)
    本篇文章围绕了CSS的核心知识点和项目中常见的需求来展开。虽然行文偏长,但较基础,适合初级中级前端阅读,阅读的时候请适当跳过已经掌握的部分。这篇文章断断续续写了比较久,也参考了许多优秀的文章,但或许文章里还是存在不好或不对的地方,请多多指教,可以评论里直接提出来哈。核心......
  • 怎么打开etl文件
    ctrl+R输入perfmon后回车C:\Users\zhang>cd/dC:\Windows\System32\LogFiles\WMIC:\Windows\System32\LogFiles\WMI>tracerpt.exeNtfsLog.etl-lr-o123.xml-ofXML......
  • ROS学习笔记(四)- ROS的launch文件
    书接上回,上次已经介绍到launch文件的一些内容了,这次详细记录学习一下。在ROS中,launch文件是一种XML文件,用于描述ROS系统中的节点、话题、参数等信息,可以用来自动化启动多个节点和启动参数服务器。在实际应用中,launch文件可以让用户非常方便地组织ROS系统的启动和配置。下面详细介......
  • jmeter分布式压测csv文件配置
    1、在控制机上添加csv数据文件设置2、将文件发送到执行机上的bin/目录下3、然后输入./文件名即可 4、最后远程执行执行机   ......
  • Redis-Cluster(redis集群)
    Redis-Cluster(redis集群)Redis-Cluster的背景介绍1.1存在的问题1.并发量:单机Redisqps为10w/s,但是我们需要百万级别的并发量2.数据量:机器内存16-256g,如果存储500g数据呢1.2解决#解决方法:加机器,分布式rediscluster在15年加入了,满足了分布式的需求数据发布(分布式数据......
  • Spring cloud:分布式module
     新增一个业务模块,统一将业务模块放在hc-modeules下在resources资源目录下新增application-properties.yml文件 该文件用来配置注册中心、配置中心信息等..在pom.xml文件添加jar包的依赖以及配置指向的父级<parent> <groupId>com.github.pig</groupId> <artifactId>pig-modu......
  • Oracle:分页
    SQL: Selectenamefromempwhereenamelike'_M%'第二个字母Selectto_char(sysdate,'yyyy')afromdual//2018selectdeptno,job,avg(sal)fromempgroupbyjob,deptno部门职员平均工资select*fromempdeptselect*fromemp,deptwhereemp.deptno......