- 浏览: 217459 次
- 性别:
- 来自: 江西
-
文章分类
- 全部博客 (109)
- C# (29)
- ASP.NET (30)
- MSSQL (29)
- javascript (9)
- cmd (3)
- ORACLE (4)
- log4j (1)
- window (5)
- FTP (1)
- Shell (1)
- java (1)
- IIS (7)
- html (11)
- SQL (3)
- Jquery (11)
- IE (3)
- 火狐、谷歌 (2)
- wince (2)
- JSON (5)
- List (1)
- Foreach (1)
- SQLhelper (1)
- Ajax (1)
- Firebird (1)
- mysql (7)
- js (2)
- jQuery.autocomplete (1)
- dataTable (1)
- Http (1)
- get (1)
- datetime (1)
- powshell (1)
- URL Protocol (1)
- Office (1)
- Excel (1)
- ASP.NET,算法,秘钥 (1)
- 浏览器 (1)
- Tomcat (1)
最新评论
使用PBKDF2算法方案,该算法是一个标准的密钥导出算法,可用于导出对称密钥, 应用PBKDF2的密钥导出函数主要是用来导出根秘钥(也叫初始密钥),然后用此根秘钥加密工作秘钥(工作秘钥由信息中心通过https传送给iRAD客户端或者其他安全通道预共享的方式传送给iRad客户端,用于记住密码功能中的加密)保存到本地。在使用PBKDF2导出根秘钥时,用到两个参数“初始向量”和“秘钥因子”, 为了满足合规要求,一是要求这两个参数都要随机生成(长度不少于128位或16字节);二是要求这两个参数分开存储,通常的做法时将初始向量数组(通过预设的随机运算——例如来自于openssl的安全随机数序列,然后产生初始向量数组)硬编码到代码中,而将秘钥因子(16进制)存储到配置文件中。
具体到利用PBKDF2算法(PKCS#5)来导出初始密钥的使用,这里提供一个参考:
计算公式为:DK = PBKDF2(Password, Salt, count, dkLen)
输入:
Password :用户输入的口令或者读取的一串字符串,这里使用“密钥因子”。
Salt :盐值,字符串,这里使用“初始向量”
count :迭代次数,正整数,默认使用“50,000”次,华为要求不小于10000次
dkLen :导出密钥的字节长度,正整数,该长度需根据应用程序或密码应用模块所需要的工作密钥长度来定义,以AES128加密算法为例,密钥长度为128bit,即16字节。
输出:
DK :导出的密钥,长度为dkLen个字节的字符串。
Hash函数:
优先使用HmacSHA256、HmacSHA384、HmacSHA512等强密码算法,如果是由于使用的加密库等方面的原因导致不支持相应的强密码算法,也可以使用HmacSHA1,但迭代次数(count)需定义为“100,000”次。
具体到利用PBKDF2算法(PKCS#5)来导出初始密钥的使用,这里提供一个参考:
计算公式为:DK = PBKDF2(Password, Salt, count, dkLen)
输入:
Password :用户输入的口令或者读取的一串字符串,这里使用“密钥因子”。
Salt :盐值,字符串,这里使用“初始向量”
count :迭代次数,正整数,默认使用“50,000”次,华为要求不小于10000次
dkLen :导出密钥的字节长度,正整数,该长度需根据应用程序或密码应用模块所需要的工作密钥长度来定义,以AES128加密算法为例,密钥长度为128bit,即16字节。
输出:
DK :导出的密钥,长度为dkLen个字节的字符串。
Hash函数:
优先使用HmacSHA256、HmacSHA384、HmacSHA512等强密码算法,如果是由于使用的加密库等方面的原因导致不支持相应的强密码算法,也可以使用HmacSHA1,但迭代次数(count)需定义为“100,000”次。

using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace TestPassword { public class PasswordSecurity { class InvalidHashException : Exception { public InvalidHashException() { } public InvalidHashException(string message) : base(message) { } public InvalidHashException(string message, Exception inner) : base(message, inner) { } } class CannotPerformOperationException : Exception { public CannotPerformOperationException() { } public CannotPerformOperationException(string message) : base(message) { } public CannotPerformOperationException(string message, Exception inner) : base(message, inner) { } } public class PasswordStorage { // These constants may be changed without breaking existing hashes. public const int SALT_BYTES = 16; // The number of bytes of salt. By default, 24 bytes, which is 192 bits. This is more than enough. This constant should not be changed. public const int HASH_BYTES = 16; public const int PBKDF2_ITERATIONS = 100000; // PBKDF2 迭代次数,默认32000 // These constants define the encoding and may not be changed. // 对应format: algorithm:iterations:hashSize:salt:hash public const int HASH_ALGORITHM_INDEX = 0; // 加密方式所对应的索引,目前只支持sha1 public const int ITERATION_INDEX = 1; // 迭代次数所对应的索引 public const int HASH_SIZE_INDEX = 2; // hashsize所对应的索引 public const int SALT_INDEX = 3; // salt值所对应的索引 public const int PBKDF2_INDEX = 4; // hash值所对应的索引 public const int HASH_SECTIONS = 5; // 总共存储几段数据;根据分隔符,对应 format中字段 private const string HASH_ALGORITHM = "sha1"; // 加密方式,目前只支持sha1 /// <summary> /// 创建hash+salt后的密码 /// </summary> /// <param name="password">原始密码,比如abcdef</param> /// <returns></returns> public static string CreateHash(string password) { // Generate a random salt byte[] salt = new byte[SALT_BYTES]; try { using (RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider()) { csprng.GetBytes(salt); } } catch (CryptographicException ex) { throw new CannotPerformOperationException("Random number generator not available.", ex); } catch (ArgumentNullException ex) { throw new CannotPerformOperationException("Invalid argument given to random number generator.", ex); } byte[] hash = PBKDF2(password, salt, PBKDF2_ITERATIONS, HASH_BYTES); // format: algorithm:iterations:hashSize:salt:hash /* * algorithm is the name of the cryptographic hash function ("sha1"). iterations is the number of PBKDF2 iterations ("64000"). hashSize is the length, in bytes, of the hash field (after decoding). salt is the salt, base64 encoded. hash is the PBKDF2 output, base64 encoded. It must encode hashSize bytes. * */ return Convert.ToBase64String(hash); //return string.Format("{0}:{1}:{2}:{3}:{4}" // , HASH_ALGORITHM // , PBKDF2_ITERATIONS // , hash.Length // , Convert.ToBase64String(salt) // , Convert.ToBase64String(hash)); } /// <summary> /// 验证密码是否有效 /// </summary> /// <param name="password">原始密码,比如abcdef</param> /// <param name="goodHash">已存的hash,从DB中读取;format: algorithm:iterations:hashSize:salt:hash</param> /// <returns></returns> public static bool VerifyPassword(string password, string goodHash) { char[] delimiter = { ':' }; string[] split = goodHash.Split(delimiter); if (split.Length != HASH_SECTIONS) { throw new InvalidHashException("Fields are missing from the password hash."); } // We only support SHA1 with C#. if (split[HASH_ALGORITHM_INDEX] != HASH_ALGORITHM) { throw new CannotPerformOperationException("Unsupported hash type."); } int iterations = 0; try { iterations = Int32.Parse(split[ITERATION_INDEX]); } catch (ArgumentNullException ex) { throw new CannotPerformOperationException("Invalid argument given to Int32.Parse", ex); } catch (FormatException ex) { throw new InvalidHashException("Could not parse the iteration count as an integer.", ex); } catch (OverflowException ex) { throw new InvalidHashException("The iteration count is too large to be represented.", ex); } if (iterations < 1) { throw new InvalidHashException("Invalid number of iterations. Must be >= 1."); } byte[] salt = null; try { salt = Convert.FromBase64String(split[SALT_INDEX]); } catch (ArgumentNullException ex) { throw new CannotPerformOperationException("Invalid argument given to Convert.FromBase64String", ex); } catch (FormatException ex) { throw new InvalidHashException("Base64 decoding of salt failed.", ex); } byte[] hash = null; try { hash = Convert.FromBase64String(split[PBKDF2_INDEX]); } catch (ArgumentNullException ex) { throw new CannotPerformOperationException("Invalid argument given to Convert.FromBase64String", ex); } catch (FormatException ex) { throw new InvalidHashException("Base64 decoding of pbkdf2 output failed.", ex); } int storedHashSize = 0; try { storedHashSize = Int32.Parse(split[HASH_SIZE_INDEX]); } catch (ArgumentNullException ex) { throw new CannotPerformOperationException("Invalid argument given to Int32.Parse", ex); } catch (FormatException ex) { throw new InvalidHashException("Could not parse the hash size as an integer.", ex); } catch (OverflowException ex) { throw new InvalidHashException("The hash size is too large to be represented.", ex); } if (storedHashSize != hash.Length) { throw new InvalidHashException("Hash length doesn't match stored hash length."); } byte[] testHash = PBKDF2(password, salt, iterations, hash.Length); return SlowEquals(hash, testHash); } private static bool SlowEquals(byte[] a, byte[] b) { uint diff = (uint)a.Length ^ (uint)b.Length; for (int i = 0; i < a.Length && i < b.Length; i++) { diff |= (uint)(a[i] ^ b[i]); } return diff == 0; } private static byte[] PBKDF2(string password, byte[] salt, int iterations, int outputBytes) { using (Rfc2898DeriveBytes pbkdf2 = new Rfc2898DeriveBytes(password, salt)) { pbkdf2.IterationCount = iterations; return pbkdf2.GetBytes(outputBytes); } } /// <summary> /// HMAC-SHA256 加密 /// </summary> /// <param name="input"> 要加密的字符串 </param> /// <param name="key"> 密钥 </param> /// <param name="encoding"> 字符编码 </param> /// <returns></returns> public static string HMACSHA256Encrypt(string input, string key, Encoding encoding) { return HashEncrypt(new HMACSHA256(encoding.GetBytes(key)), input, encoding); } /// <summary> /// 哈希加密算法 /// </summary> /// <param name="hashAlgorithm"> 所有加密哈希算法实现均必须从中派生的基类 </param> /// <param name="input"> 待加密的字符串 </param> /// <param name="encoding"> 字符编码 </param> /// <returns></returns> private static string HashEncrypt(HashAlgorithm hashAlgorithm, string input, Encoding encoding) { var data = hashAlgorithm.ComputeHash(encoding.GetBytes(input)); return BitConverter.ToString(data).Replace("-", ""); } } } } ///生成根秘钥 using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace TestPassword { class Program { public Program() { } /// <summary> /// 加密字符串 /// </summary> /// <param name="rmd"></param> /// <param name="str"></param> /// <returns></returns> public string CharEncrypt(RootModel rmd, string str) { string strKey = string.Empty; //解密工作秘钥 (加密方式AES/CBC/ISO10126) string strWorkKey = AesHelper.AESDecryptNew(rmd.workKeyEcpt, rmd.rootKey, rmd.workKeyIV); //先UTF-8,BASE 64 string EnStr = Convert.ToBase64String(Encoding.UTF8.GetBytes(str)); //加密字符串 strKey = AesHelper.AESEncrypt(EnStr, strWorkKey, RNGCSP.RNGGetRandom()); if(!string.IsNullOrWhiteSpace(strKey)) { strKey += "@" + RNGCSP.RNGGetRandom(); } return strKey; } /// <summary> /// 解密字符串 /// </summary> /// <param name="rmd"></param> /// <returns></returns> public string WorkDecrypt(RootModel rmd, string strDecrypt) { //解密工作秘钥 (加密方式AES/CBC/ISO10126) string strWorkKey= AesHelper.AESDecryptNew(rmd.workKeyEcpt, rmd.rootKey, rmd.workKeyIV); string strNew = string.Empty; if (!string.IsNullOrWhiteSpace(strDecrypt)) { if(strDecrypt.Contains("@")) { string[] arr = strDecrypt.Split('@'); if (arr.Length>1) { //解密字符串 strNew = AesHelper.AESDecryptNew(arr[0], strWorkKey, arr[1]); } } } return Encoding.UTF8.GetString(Convert.FromBase64String(strNew)); } static void Main(string[] args) { Program pro = new Program(); RootModel rm = new RootModel(); //根密钥 rm.rootKey = "M2UyYzQ0NmMwNjNjYTQ4OA=="; //工作秘钥IV rm.workKeyIV = "mlJDbTEmDjBD/1xy6jBomg=="; //工作秘钥加密后 rm.workKeyEcpt = "3R8RaUxY1Fy7UJ8BvOdYbYxkL6fzdXaOfObdl21bxaI="; //解密字符串 string strDecrypt = "EjwONCy04h0/AE3l+A4y9A==@Uz2VFravYLeG+oyqrFUS7w=="; //解密字符串 //string strChar = pro.WorkDecrypt(rm, strDecrypt); //加密字符串 string strEnChar = pro.CharEncrypt(rm, "testpjf"); Console.WriteLine(strEnChar); //string strChar = pro.WorkDecrypt(rm, strEnChar); ////生成根秘钥 初始向量、秘钥因子(字符串) byte[] RootKey = new byte[32]; ////生成根密钥(PBDF2导出根密钥) string RootSecretKey = pro.EncodePassWord("M2UyYzQ0NmMwNjNjYTQ4OA=="); Console.ReadKey(); } public string EncodePassWord(string strPwd) { return PasswordSecurity.PasswordStorage.CreateHash(strPwd); // sha1:64000:18:ou2x9eUw82+dnxGetsTaNJLzLXiaElu8:7Ga+qwM4g8Bb/iPOfnQTd6HA // sha1:64000:18:8daBj8djNvUBLE5Y3vRTvMaooydwBfYg:EV9mmvk1oinBGPoufd3aQ85m //Assert.IsNotNull(hashPassword); } public bool decodePassWord(string strPwd,string strEncodePwd) { return PasswordSecurity.PasswordStorage.VerifyPassword(strPwd,strEncodePwd); // Assert.IsTrue(result); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestPassword { using System; using System.IO; using System.Text; using System.Security.Cryptography; //生成随机数 public class RNGCSP { private static RNGCryptoServiceProvider rngCsp = new RNGCryptoServiceProvider(); private static int S_BYTES = 16; public static string RNGGetRandom() { string strResult=string.Empty; byte[] salt = new byte[S_BYTES]; try { using (RNGCryptoServiceProvider csprng = new RNGCryptoServiceProvider()) { csprng.GetBytes(salt); } } catch (CryptographicException ex) { return null; } return Convert.ToBase64String(salt); } } } using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace TestPassword { public class RootModel { /// <summary> /// 加密后根密钥 /// </summary> public string rootKey { get; set; } /// <summary> /// 加密后工作秘钥 /// </summary> public string workKeyEcpt { get; set; } /// <summary> /// 工作IV盐值 /// </summary> public string workKeyIV { get; set; } } } using System; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; namespace TestPassword { public class AesHelper { /// <summary> /// AES加密 (128-ECB加密模式) /// </summary> /// <param name="toEncrypt">内容</param> /// <param name="key">秘钥</param> /// <returns></returns> public static string AESEncrypt(string toEncrypt, string key,string IV) { try { // byte[] keyArray = Convert.FromBase64String(key); byte[] toEncryptArray = Convert.FromBase64String(Convert.ToBase64String(Encoding.UTF8.GetBytes(toEncrypt))); byte[] IVArray = Convert.FromBase64String(IV); using (RijndaelManaged rDel = new RijndaelManaged()) { rDel.Key = keyArray; rDel.IV = IVArray; rDel.Mode = CipherMode.CBC; rDel.Padding = PaddingMode.ISO10126; ICryptoTransform cTransform = rDel.CreateEncryptor(); byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray, 0, resultArray.Length); } } catch { return null; } } /// <summary> /// AES解密(128-ECB加密模式) /// </summary> /// <param name="toDecrypt">密文</param> /// <param name="key">秘钥(Base64String)</param> /// <returns></returns> public static string AESDecryptNew(string toDecrypt, string Rootkey,string IV) { try { byte[] RootkeyArray = Convert.FromBase64String(Rootkey); //128bit byte[] toEncryptArray = Convert.FromBase64String(toDecrypt); byte[] IVArray = Convert.FromBase64String(IV); //128bit using ( RijndaelManaged rDel = new RijndaelManaged()) { rDel.Key = RootkeyArray; //获取或设置对称算法的密钥 rDel.Mode = CipherMode.CBC; //获取或设置对称算法的运算模式,必须设置为CBC rDel.IV = IVArray; rDel.Padding = PaddingMode.ISO10126; //获取或设置对称算法中使用的填充模式,必须设置为PKCS7 ICryptoTransform cTransform = rDel.CreateDecryptor(); //用当前的 Key 属性和初始化向量 (IV) 创建对称解密器对象 byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length); return Convert.ToBase64String(resultArray); } } catch { return null; } } } }
发表评论
-
AES 动态生成秘钥
2018-09-28 14:29 13101:方法一 通过账号+日期进行AES128位加密,取其前面16 ... -
Microsoft Office Excel 不能访问文件“EXCEL.xls”
2018-08-25 16:31 1157Microsoft Office Excel 不能访问文件“X ... -
微信分享
2017-04-20 14:15 699/// <summary> // ... -
web.config 为某个单独页面设置编码格式
2017-03-31 18:28 1187原文链接:http://www.cnblogs.com/m ... -
json日期格式转换成日期字符串
2016-08-29 10:31 2210这里进行去掉json日期的\date\字符串: st ... -
C# http get请求 判断是否存在该图片信息
2016-08-29 10:25 1013/// <summary> /// h ... -
C# 将json转换成Datatable
2016-08-29 10:19 1342/// <summary> /// 将 ... -
jQuery.autocomplete.js乱码问题
2016-07-12 14:01 7301、首先修改jQuery.autocomplete.js 文件 ... -
C# 缓存
2016-06-24 15:27 769using System; using System.Col ... -
jquery table 操作
2014-12-06 19:21 985jQuery在客户端操作Table ... -
Firebird单击嵌入式非安装版使用
2014-03-12 18:48 2481Firebird单击嵌入式非安 ... -
C#开发常用的工具类
2014-02-26 13:47 1385using System; using System.Col ... -
SQLhelper帮助类
2014-02-26 13:33 4678using System; using System.Col ... -
C#中将JSon数据转换成实体类,将实体类转换成Json
2014-02-26 13:22 44006using System; using System.Col ... -
C#反射机制介绍
2014-02-25 11:26 1766反射的定义:审查元数据并收集关于它的类型信息的能力。元数据(编 ... -
LIST集合已修改;可能无法执行枚举操作。
2014-02-18 23:17 1032foreach是取只读的,在取的时候数据不 能变(包括修改,删 ... -
COM 类工厂中 CLSID 为 {A86BB4D8-209D-40E1-87A6-7AA236094FAD} 的组件时失败,原因是出现以下错误: 800401
2013-09-12 13:21 1622第一: 检查dll文件是否存在 第二: 兼容问题,看i ... -
ASP.NET中url传递中文的解决方案,传递参数为汉字时出现乱码等问题
2013-09-11 16:13 921来源:http://hi.baidu.com/netkey/i ... -
常用的WebService一览表
2013-09-05 10:43 698转载:http://blog.csdn.net/wangzh3 ... -
批量插入数据 C# SqlBulkCopy使用
2013-09-05 10:31 969private static void Dat ...
相关推荐
全国大学生智能汽车竞赛自2006年起,由教育部高等教育司委托高等学校自动化类教学指导委员会举办,旨在加强学生实践、创新能力和培养团队精神的一项创意性科技竞赛。该竞赛至今已成功举办多届,吸引了众多高校学生的积极参与,此文件为智能车竞赛介绍
字卡v4.3.4 原版 三种UI+关键字卡控制+支持获取用户信息+支持强制关注 集卡模块从一开始的版本到助力版本再到现在的新规则版本。 集卡模块难度主要在于 如何控制各种不同的字卡组合 被粉丝集齐的数量。 如果不控制那么一定会出现超过数量的粉丝集到指定的字卡组合,造成奖品不够的混乱,如果大奖价值高的话,超过数量的粉丝集到大奖后,就造成商家的活动费用超支了。我们冥思苦想如何才能限制集到指定字卡组合的粉丝数,后我们想到了和支付宝一样的选一张关键字卡来进行规则设置的方式来进行限制,根据奖品所需的关键字卡数,设定规则就可以控制每种奖品所需字卡组合被粉丝集到的数量,规则可以在活动进行中根据需要进行修改,活动规则灵活度高。新版的集卡规则,在此次政府发布号的活动中经受了考验,集到指定字卡组合的粉丝没有超出规则限制。有了这个规则限制后,您无需盯着活动,建好活动后就无人值守让活动进行就行了,您只需要时不时来看下蹭蹭上涨的活动数据即可。 被封? 无需担心,模块内置有防封功能,支持隐藏主域名,显示炮灰域名,保护活动安全进行。 活动准备? 只需要您有一个认证服务号即可,支持订阅号借用认证服务号来做活动。如果您
出口设备线体程序详解:PLC通讯下的V90控制与开源FB284工艺对象实战指南,出口设备线体程序详解:PLC通讯与V90控制集成,工艺对象与FB284协同工作,开源学习V90控制技能,出口设备1200线体程序,多个plc走通讯,内部有多个v90,采用工艺对象与fb284 共同控制,功能快全部开源,能快速学会v90的控制 ,出口设备; 1200线体程序; PLC通讯; 多个V90; 工艺对象; FB284; 功能开源; V90控制。,V90工艺控制:开源功能快,快速掌握1200线体程序与PLC通讯
基于Arduino与DAC8031的心电信号模拟器资料:心电信号与正弦波的双重输出应用方案,Arduino与DAC8031心电信号模拟器:生成心电信号与正弦波输出功能详解,基于arduino +DAC8031的心电信号模拟器资料,可输出心电信号,和正弦波 ,基于Arduino;DAC8031;心电信号模拟器;输出心电信号;正弦波输出;模拟器资料,基于Arduino与DAC8031的心电信号模拟器:输出心电与正弦波
MATLAB口罩检测的基本流程 图像采集:通过摄像头或其他图像采集设备获取包含面部的图像。 图像预处理:对采集到的图像进行灰度化、去噪、直方图均衡化等预处理操作,以提高图像质量,便于后续的人脸检测和口罩检测。 人脸检测:利用Haar特征、LBP特征等经典方法或深度学习模型(如MTCNN、FaceBoxes等)在预处理后的图像中定位人脸区域。 口罩检测:在检测到的人脸区域内,进一步分析是否佩戴口罩。这可以通过检测口罩的边缘、纹理等特征,或使用已经训练好的口罩检测模型来实现。 结果输出:将检测结果以可视化方式展示,如在图像上标注人脸和口罩区域,或输出文字提示是否佩戴口罩。
1、文件内容:kernel-debug-devel-3.10.0-1160.119.1.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/kernel-debug-devel-3.10.0-1160.119.1.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、更多资源/技术支持:公众号禅静编程坊
该文档提供了一个关于供应链管理系统开发的详细指南,重点介绍了项目安排、技术实现和框架搭建的相关内容。 文档分为以下几个关键部分: 项目安排:主要步骤包括搭建框架(1天),基础数据模块和权限管理(4天),以及应收应付和销售管理(5天)。 供应链概念:供应链系统的核心流程是通过采购商品放入仓库,并在销售时从仓库提取商品,涉及三个主要订单:采购订单、销售订单和调拨订单。 大数据的应用:介绍了数据挖掘、ETL(数据抽取)和BI(商业智能)在供应链管理中的应用。 技术实现:讲述了DAO(数据访问对象)的重用、服务层的重用、以及前端JS的继承机制、jQuery插件开发等技术细节。 系统框架搭建:包括Maven环境的配置、Web工程的创建、持久化类和映射文件的编写,以及Spring配置文件的实现。 DAO的需求和功能:供应链管理系统的各个模块都涉及分页查询、条件查询、删除、增加、修改操作等需求。 泛型的应用:通过示例说明了在Java语言中如何使用泛型来实现模块化和可扩展性。 文档非常技术导向,适合开发人员参考,用于构建供应链管理系统的架构和功能模块。
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进行数据读写,定时器与计数器数据区的简洁读写操作示例,C#与VB实现欧姆龙PLC的Fins TCP通信案例源码:调用动态链接库进行读写操作,涵盖定时器计数器数据区学习案例,C#欧姆龙plc Fins Tcp通信案例上位机源码,有c#和VB的Demo,c#上位机和欧姆龙plc通讯案例源码,调用动态链接库,可以实现上位机的数据连接,可以简单实现D区W区定时器计数器等数据区的读写,是一个非常好的学习案例 ,C#; 欧姆龙PLC; Fins Tcp通信; 上位机源码; 动态链接库; 数据连接; D区W区读写; 定时器计数器; 学习案例,C#实现欧姆龙PLC Fins Tcp通信上位机源码,读写数据区高效学习案例
可调谐石墨烯超材料吸收体的FDTD仿真模拟研究报告:吸收光谱的化学势调节策略与仿真源文件解析,可调谐石墨烯超材料吸收体:化学势调节光谱的FDTD仿真模拟研究,可调谐石墨烯超材料吸收体FDTD仿真模拟 【案例内容】该案例提供了一种可调谐石墨烯超材料吸收体,其吸收光谱可以通过改变施加于石墨烯的化学势来进行调节。 【案例文件】仿真源文件 ,可调谐石墨烯超材料吸收体; FDTD仿真模拟; 化学势调节; 仿真源文件,石墨烯超材料吸收体:FDTD仿真调节吸收光谱案例解析
RBF神经网络控制仿真-第二版
松下PLC与威纶通触摸屏转盘设备控制:FPWINPRO7与EBPRO智能编程与宏指令应用,松下PLC与威纶通触摸屏转盘设备控制解决方案:FPWINPRO7与EBPRO协同工作,实现多工位转盘加工与IEC编程模式控制,松下PLC+威纶通触摸屏的转盘设备 松下PLC工程使用程序版本为FPWINPRO7 7.6.0.0版本 威纶通HMI工程使用程序版本为EBPRO 6.07.02.410S 1.多工位转盘加工控制。 2.国际标准IEC编程模式。 3.触摸屏宏指令应用控制。 ,松下PLC; 威纶通触摸屏; 转盘设备控制; 多工位加工控制; IEC编程模式; 触摸屏宏指令应用,松下PLC与威纶通HMI联控的转盘设备控制程序解析
基于循环神经网络(RNN)的多输入单输出预测模型(适用于时间序列预测与回归分析,需Matlab 2021及以上版本),基于循环神经网络(RNN)的多输入单输出预测模型(matlab版本2021+),真实值与预测值对比,多种评价指标与线性拟合展示。,RNN预测模型做多输入单输出预测模型,直接替数据就可以用。 程序语言是matlab,需求最低版本为2021及以上。 程序可以出真实值和预测值对比图,线性拟合图,可打印多种评价指标。 PS:以下效果图为测试数据的效果图,主要目的是为了显示程序运行可以出的结果图,具体预测效果以个人的具体数据为准。 2.由于每个人的数据都是独一无二的,因此无法做到可以任何人的数据直接替就可以得到自己满意的效果。 这段程序主要是一个基于循环神经网络(RNN)的预测模型。它的应用领域可以是时间序列预测、回归分析等。下面我将对程序的运行过程进行详细解释和分析。 首先,程序开始时清空环境变量、关闭图窗、清空变量和命令行。然后,通过xlsread函数导入数据,其中'数据的输入'和'数据的输出'是两个Excel文件的文件名。 接下来,程序对数据进行归一化处理。首先使用ma
1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。
旅游管理系统中的功能模块主要是实现管理员;首页、个人中心、用户管理、旅游方案管理、旅游购买管理、系统管理,用户;首页、个人中心、旅游方案管理、旅游购买管理、我的收藏管理。前台首页;首页、旅游方案、旅游资讯、个人中心、后台管理等功能。经过认真细致的研究,精心准备和规划,最后测试成功,系统可以正常使用。分析功能调整与旅游管理系统实现的实际需求相结合,讨论了Java开发旅游管理系统的使用。 从上面的描述中可以基本可以实现软件的功能: 1、开发实现旅游管理系统的整个系统程序; 2、管理员;首页、个人中心、用户管理、旅游方案管理、旅游购买管理、系统管理等。 3、用户:首页、个人中心、旅游方案管理、旅游购买管理、我的收藏管理。 4、前台首页:首页、旅游方案、旅游资讯、个人中心、后台管理等相应操作; 5、基础数据管理:实现系统基本信息的添加、修改及删除等操作,并且根据需求进行交流查看及回复相应操作。
Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构的Simulink建模与MPPT最大功率点追踪:基于功率反馈的扰动观察法调整电压方向研究,Boost二级升压光伏并网结构,Simulink建模,MPPT最大功率点追踪,扰动观察法采用功率反馈方式,若ΔP>0,说明电压调整的方向正确,可以继续按原方向进行“干扰”;若ΔP<0,说明电压调整的方向错误,需要对“干扰”的方向进行改变。 ,Boost升压;光伏并网结构;Simulink建模;MPPT最大功率点追踪;扰动观察法;功率反馈;电压调整方向。,光伏并网结构中Boost升压MPPT控制策略的Simulink建模与功率反馈扰动观察法
运行GUI版本,可二开
Deepseek相关主题资源及行业影响
WP Smush Pro 是一款专为 WordPress 网站设计的图像优化插件。 一、主要作用 图像压缩 它能够在不影响图像质量的前提下,大幅度减小图像文件的大小。例如,对于一些高分辨率的产品图片或者风景照片,它可以通过先进的压缩算法,去除图像中多余的数据。通常 JPEG 格式的图像经过压缩后,文件大小可以减少 40% – 70% 左右。这对于网站性能优化非常关键,因为较小的图像文件可以加快网站的加载速度。 该插件支持多种图像格式的压缩,包括 JPEG、PNG 和 GIF。对于 PNG 图像,它可以在保留透明度等关键特性的同时,有效地减小文件尺寸。对于 GIF 图像,也能在一定程度上优化文件大小,减少动画 GIF 的加载时间。 懒加载 WP Smush Pro 实现了图像懒加载功能。懒加载是一种延迟加载图像的技术,当用户滚动页面到包含图像的位置时,图像才会加载。这样可以避免一次性加载大量图像,尤其是在页面内容较多且包含许多图像的情况下。例如,在一个新闻网站的长文章页面,带有大量配图,懒加载可以让用户在浏览文章开头部分时,不需要等待所有图片加载,从而提高页面的初始加载速度,同时也能
Could not create share link. Missing file: C:\Users\xx\.conda\envs\omni\Lib\site-packages\gradio\frpc_windows_amd64_v0.3 1. Download this file: https://cdn-media.huggingface.co/frpc-gradio-0.3/frpc_windows_amd64.exe 2. Rename the downloaded file to: frpc_windows_amd64_v0.3 3. Move the file to this location: C:\Users\xx\.conda\envs\omni\Lib\site-packages\gradio