大家好!今天让小编来大家介绍下关于js多线程ArryBuff(怎么把mysql数据库中现有的数据进行des加密,加密后的结果和jv中des加密的结果一样)的问题,以下是小编对此问题的归纳整理,让我们一起来看看吧。
文章目录列表:
字符串返回值 3. 修改传入字符串内容 4. 数组参数 5. IDispatch接口介绍 6. 修改输入数组内容 7. 增加数组内容 8. 以数组传参方式,VT_DISPATCH表示是一个IDispatch对象4. 给对象中每一属性或函数(Method)分配一个整形Id和一个字符串name,4. COM中C++定义IDispatch接口介绍1. C程序调用时,修改输入数组内容1. 第五节介绍了如何从JS向COM传递数组参数,本节介绍如何在COM中修改JS传入的数组,1. 整形数组传参 2. 字符串参数,其中I表示整形、4表示4字节)3. JS中的Array在COM中是一个实现了IDispatch的对象,首相调用 IDispatch::GetIDsOfNames()将属性、函数名称作为参数。
本文目录
- 怎么把mysql数据库中现有的数据进行des加密,加密后的结果和java中des加密的结果一样
- 如何在JavaScript与ActiveX之间传递数据
- 一个java程序,200分,拜托了,我这周考三门,真的没时间写了
怎么把mysql数据库中现有的数据进行des加密,加密后的结果和java中des加密的结果一样
最近需要对数据进行加密/解密, 因此选用了CryptoJS库, 对数据做DES算法的加密/解密首选查看官方示例, 将密文进行Base64编码, 掉进一个大坑《script src="htt p:/ /crypto-js.googlecod e.c om/svn/tags/3.1.2/build/rollups/tripledes.js"》《/script》《script》 var encrypted = CryptoJS.DES.encrypt("Message", "Secret Passphrase"); // ciphertext changed every time you run it // 加密的结果不应该每次都是一样的吗? console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64)); var decrypted = CryptoJS.DES.decrypt(encrypted, "Secret Passphrase"); console.log(decrypted.toString(CryptoJS.enc.Utf8));《/script》对这些加密算法不了解, 只能求助Googledes encrypion: js encrypted value does not match the java encrypted valueIn cryptoJS you have to convert the key to hex and useit as word just like above (otherwise it will be considered as passphrase)For the key, when you pass a string, it’s treated as a passphrase and used to derive an actual key and IV. Or you can pass a WordArray that represents the actual key.原来是我指定key的方式不对, 直接将字符串做为参数, 想当然的以为这就是key, 其实不然, CryptoJS会根据这个字符串算出真正的key和IV(各种新鲜名词不解释, 问我也没用, 我也不懂 -_-")那么我们只需要将key和iv对应的字符串转成CryptoJS的WordArray类型, 在DES加密时做为参数传入即可, 这样对Message这个字符串加密, 每次得到的密文都是YOa3le0I+dI= var keyHex = CryptoJS.enc.Utf8.parse(’abcd1234’); var ivHex = CryptoJS.enc.Utf8.parse(’inputvec’); var encrypted = CryptoJS.DES.encrypt(’Message’, keyHex, { iv: ivHex });这样是不是就万事OK了? 哪有, 谁知道这坑是一个接一个啊.我们再试试Java这边的DES加密是不是和这个结果一样, 具体实现请参考Simple Java Class to DES Encrypt Strings果真掉坑里了, Java通过DES加密Message这个字符串得到的结果是8dKft9vkZ4I=和CryptoJS算出来的不一样啊...亲继续求助GoogleC# and Java DES Encryption value are not identicalSunJCE provider uses ECB as the default mode, and PKCS5Padding as the default padding scheme for DES.(JCA Doc)This means that in the case of the SunJCE provider, Cipher c1 = Cipher.getInstance("DES/ECB/PKCS5Padding");and Cipher c1 = Cipher.getInstance("DES");are equivalent statements.原来是CryptoJS进行DES加密时, 默认的模式和padding方式和Java默认的不一样造成的, 必须使用ECB mode和PKCS5Padding, 但是CryptoJS中只有Pkcs7, 不管了, 试试看...《script src="htt p:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/rollups/tripledes.js"》《/script》《script src="ht tp:/ /crypto-js.googleco de.c om/svn/tags/3.1.2/build/components/mode-ecb.js"》《/script》《script》 var keyHex = CryptoJS.enc.Utf8.parse(’abcd1234’); var encrypted = CryptoJS.DES.encrypt(’Message’, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); console.log(encrypted.toString(), encrypted.ciphertext.toString(CryptoJS.enc.Base64));《/script》咦...使用Pkcs7能得到和Java DES一样的结果了, 哇塞...好神奇那我们试试统一Java也改成Cipher.getInstance("DES/ECB/PKCS7Padding")试试, 结果得到一个大大的错误Error:java.security.NoSuchAlgorithmException: Cannot find any provider supporting DES/ECB/PKCS7Padding没办法, 继续Googlejava.security.NoSuchAlgorithmException: Cannot find any provider supporting AES/ECB/PKCS7PADDINGI will point out that PKCS#5 and PKCS#7 actually specify exactly the same type of padding (they are the same!), but it’s called #5 when used in this context. :)这位大侠给出的解释是: PKCS#5和PKCS#7是一样的padding方式, 对加密算法一知半解, 我也只能暂且认可这个解释了.忙完了DES的加密, 接下来就是使用CryptoJS来解密了. 我们需要直接解密DES加密后的base64密文字符串. CryptoJS好像没有提供直接解密DES密文字符串的方法啊, 他的整个加密/解密过程都是内部自己在玩, 解密时需要用到加密的结果对象, 这不是坑我吗?只好研究下CryptoJS DES加密后返回的对象, 发现有一个属性ciphertext, 就是密文的WordArray, 那么解密的时候, 我们是不是只要提供这个就行了呢? var keyHex = CryptoJS.enc.Utf8.parse(’abcd1234’); // direct decrypt ciphertext var decrypted = CryptoJS.DES.decrypt({ ciphertext: CryptoJS.enc.Base64.parse(’8dKft9vkZ4I=’) }, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); console.log(decrypted.toString(CryptoJS.enc.Utf8));果不其然, 到此为止, 问题全部解决, 豁然开朗...完整代码请参考CryptoJS-DES.htmlUse CryptoJS encrypt message by DES and direct decrypt ciphertext, compatible with Java Cipher.getInstance("DES")
如何在JavaScript与ActiveX之间传递数据
在JS等脚本语言与ActiveX控件之间通信,如何传递各种类型的参数,以及COM的IDispatch接口。使用类似的方法,可以推广到其他所有脚本型语言,如LUA,AutoCad等。 1. 整形数组传参 2. 字符串参数,字符串返回值 3. 修改传入字符串内容 4. 数组参数 5. IDispatch接口介绍 6. 修改输入数组内容 7. 增加数组内容 8. 以数组传参方式,JS调用S4Execute( )1. 在使用时,有时需要使用数组传参,如S4Execute( )的inBuff/ outBuff。2. JS中整形数据不分Byte/ Short/ Int等,因此数组元素类型都为int (COM中的VT_I4,其中I表示整形、4表示4字节)3. JS中的Array在COM中是一个实现了IDispatch的对象,可通过IDispatch接口api进行操作。关于IDispatch请看下一节介绍。4. COM中C++定义IDispatch接口介绍1. C程序调用时,调用者必须预先知道接口规范(如,参数类型、参数字节长度、参数顺序等)。由于不同语言这些规范有所不同,COM未解决不同语言之间调用,提供了IDispatch接口。2. IDispatch要求其实例必须自我描述,即拿到一个对象后,可从对象中直接获取调用方式,而无须预先明确。3. IDispatch中通过VT_TYPE来指定相关类型,如 VT_I4为4字节整形、VT_BSTR为unicode字符串,VT_DISPATCH表示是一个IDispatch对象4. 给对象中每一属性或函数(Method)分配一个整形Id和一个字符串name,调用者可以通过name字符串确定如何调用。如,若name为"length"的属性,调用者就理解为长度。由于这里通常是根据name来理解相应属性,因此name描述应足够准确。如,以"length()"为名称的函数实现整数相加功能就是不恰当的。5. 使用IDispatch对象时,首相调用 IDispatch::GetIDsOfNames()将属性、函数名称作为参数,获取对应的属性、函数id。6. 再调用IDispatch::Invoke() 将id作为参数,实际调用功能。7. 若为获取属性值,则 Invoke()调用时,传入 Dispatch_PropertyGet标志。8. 若为设置属性值,则Invoke()调用时,传入 Dispatch_PropertyPut标志。并在 DispParams参数中指定修该属性改为何值。DispParams结构说明见后。9. 若为调用函数,则 Invoke()调用时,传入 Dispatch_Method标志。若该Method需要参数,则通过IDispatch::Invoke()的DispParams参数指定。修改输入数组内容1. 第五节介绍了如何从JS向COM传递数组参数,以及如何在COM中获取参数。本节介绍如何在COM中修改JS传入的数组。2. 修改JS数组值时,首先通过GetIDsOfNames获取指定序号元素的dispid;然后调用Invoke(),传入Dispatch_PropertyPut标志表明写操作,并在DispParams结构中指明此元素类型和元素值。
一个java程序,200分,拜托了,我这周考三门,真的没时间写了
//已经做好了,实测貌似没问题哦~~//DrawFrame.java (主程式,含程序入口);import java.awt.*;import java.awt.event.*;import java.awt.geom.*;import java.awt.image.BufferedImage;import java.util.*;import javax.swing.*;import javax.swing.event.*;public class DrawFrame extends JFrame{ private static final long serialVersionUID = -6016640305196475801L; private MyCanvas canvas; private JPanel menuPanel; private JButton enableDrawButton,resetButton,colorSelectButton; private JColorChooser colorChooser; private JDialog colorChooserDialog; //构造函数,对组件进行初始化 public DrawFrame(){ super("Draw shape demo"); this.getContentPane().setLayout(new BorderLayout()); this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); canvas= new MyCanvas(); enableDrawButton = new JButton("new"); resetButton = new JButton("reset"); colorSelectButton = new JButton("color"); enableDrawButton.setBounds(10,4,68,20); colorSelectButton.setBounds(88,4,68,20); resetButton.setBounds(166,4,68,20); menuPanel =new JPanel(null); menuPanel.setPreferredSize(new Dimension(500,30)); menuPanel.add(enableDrawButton); menuPanel.add(colorSelectButton); menuPanel.add(resetButton); colorChooser = new JColorChooser(); colorChooserDialog = new JDialog(this,"Color Selector"); colorChooserDialog.setSize(400,300); colorChooserDialog.getContentPane().add(colorChooser); initListeners(); this.add(canvas);//将画布放入中央位置 this.add(menuPanel,"South");//菜单放在底部 this.setSize(500,500);//窗口大小 this.setLocationRelativeTo(null);//初始位置在屏幕正中间 colorChooserDialog.setLocationRelativeTo(DrawFrame.this);//初始的颜色选择器在窗口正中央 this.setVisible(true); } //给组件加入事件侦听器 private void initListeners() { ActionListener l = new ActionListener(){ public void actionPerformed(ActionEvent e) { Object o = e.getSource(); if(o.equals(enableDrawButton)) canvas.enableDrawSomething(); else if(o.equals(colorSelectButton)){ colorChooserDialog.setVisible(true); } else if(o.equals(resetButton)) canvas.reset(); } }; enableDrawButton.addActionListener(l); colorSelectButton.addActionListener(l); resetButton.addActionListener(l); colorChooser.getSelectionModel().addChangeListener(new ChangeListener(){ public void stateChanged(ChangeEvent arg0) { Color color = colorChooser.getColor(); canvas.fillShape(color); } }); } public static void main(String args) { new DrawFrame(); }}/*用户要求:1.500*500窗口,鼠标进去背景是白色,出来背景是灰色.2.下面3个按钮,new color reset3.点new 然后再点空白地方,可以 创造黑色的圆,最多造三个,第四个点下去不会发生任何事情.4.点color会出来一个颜色的菜单,这个拿什么做都无所谓,有效果就行,选颜色,然后点已经有点圆 ,圆会渐变成那个颜色.5.reset 一切归零. * *//** * 目前只能画正圆,在画好的圆上拖动鼠标能对它进行移动操作,在任意的圆上点击都将选中这个圆. * 能对选中的圆进行填充颜色操作,目前没有实现去色操作(其实很简单), * 鼠标移动到画布就会更改画布的背景色,进去是白色,出来是亮灰色(可自定 bgColor), * 有图形数量限制,最多3个(可自定 total) * 在LINUX下使用不会有兼容问题,但中文注释可能无法正常显示!(我可懒得去LINUX下写这个,呵呵) * */class MyCanvas extends Canvas implements MouseListener,MouseMotionListener{ private static final long serialVersionUID = 14567890L; private Color lineColor,bgColor;//边框色,背景色 private int total = 3;//最多可画3个图形 private boolean enableDraw;//允许作图 private ArrayList《SC》 list;//图形包装类容器 private SC selectedSC;//被点选中的图形 private int x,y,w,h;//作图用的坐标,屏幕大小 private BufferedImage finalBuffer,tmpBuffer;//缓冲区图像 //构造函数 MyCanvas(){ this.w=getToolkit().getScreenSize().width; this.h=getToolkit().getScreenSize().height; finalBuffer = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB); tmpBuffer = new BufferedImage(w,h,BufferedImage.TYPE_INT_ARGB); list = new ArrayList《SC》(); lineColor = Color.black; bgColor=Color.LIGHT_GRAY; this.setBackground(bgColor); this.addMouseListener(this); this.addMouseMotionListener(this); } //重写此方法,使画布在被破坏后能显示缓冲的内容 public void paint(Graphics g){ drawToFace(); } public void mouseClicked(MouseEvent e) {} //按指定颜色填充被选中的图形 public void fillShape(Color color) { for(SC sc:list){ if(sc.isSelected){ sc.color=color; sc.isFilled=true; break; } } drawArray(); drawToFace(); } //复位画布 public void reset() { enableDraw=false; list.clear(); bgColor=Color.LIGHT_GRAY; this.setBackground(bgColor); drawArray(); drawToFace(); } //作图形关 public void enableDrawSomething() { enableDraw=true; } //将全部内容画到画布上 private void drawBuff(int X,int Y){ createSC(X,Y); drawArray(); drawToFace(); } //创建SC对象实例,新建的SC对象默认是被选中的 private void createSC(int X,int Y) { SC sc = new SC(); Point p = new Point(x,y); Point2D p2 = new Point2D.Double(X,Y); int dist = (int)p.distance(p2); sc.x=x-dist;sc.y=y-dist; sc.w=sc.h=dist*2; sc.shape=new Ellipse2D.Double(sc.x,sc.y,sc.w,sc.h); list.add(sc); } //临时作画(拖动时的作画过程) private void drawTmp(int X,int Y){ //画图形到缓冲区 Graphics g = tmpBuffer.getGraphics(); g.setColor(Color.white); g.fillRect(0,0,w,h);// drawArray(); g.drawImage(finalBuffer,0,0,null);//先画上以前已画过的图形 g.setColor(lineColor); g.drawOval(x,y,0,0); Point p = new Point(x,y); Point2D p2 = new Point2D.Double(X,Y); int dist = (int)p.distance(p2); g.drawOval(x-dist,y-dist,dist*2,dist*2); g.dispose(); //画图形到画布 g = this.getGraphics(); g.drawImage(tmpBuffer,0,0,null); g.dispose(); } //将图形包装类容器中的内容画到缓冲区 private void drawArray() { Collections.sort(list);//根据Z轴向值排序容器内容 Collections.reverse(list);//反向使Z轴值大的先画,这样就能使Z轴值小的更靠近用户 Graphics2D g = finalBuffer.createGraphics();//建立缓冲区图形 g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);//反锯齿设置 g.setColor(bgColor); g.fillRect(0,0,w,h);//填充背景 for(SC s:list){//开始画图 g.setColor(lineColor); g.draw(s.shape);//绘制图形外轮廓 if(s.isFilled){//填充图形 g.setColor(s.color); g.fill(s.shape); } } g.dispose(); } //根据鼠标的出入来更改背景色(用户需要) private void changeBgc(Color bgc){ this.bgColor=bgc; drawArray(); drawToFace(); } //将最终缓冲的内容印到画布 private void drawToFace(){ Graphics g = this.getGraphics(); g.drawImage(finalBuffer,0,0,null); g.dispose(); } //移动图形的操作方法 private void moveSc(int X,int Y){ selectedSC.x=X+selectedSC.sx; selectedSC.y=Y+selectedSC.sy; Ellipse2D e2d = (Ellipse2D)selectedSC.shape; e2d.setFrame(selectedSC.x,selectedSC.y,selectedSC.w,selectedSC.h); drawArray(); drawToFace(); } public void mouseEntered(MouseEvent e) {changeBgc(Color.white);} public void mouseExited(MouseEvent e) {changeBgc(Color.LIGHT_GRAY);} //鼠标点击事件处理方法 public void mousePressed(MouseEvent e) { if(!enableDraw)return; this.x=e.getX(); this.y=e.getY(); selectedSC=null; ArrayList《SC》 tmp = new ArrayList《SC》(); for(SC s:list){ s.isSelected=false; if(s.shape.contains(e.getPoint())){ tmp.add(s); } } Collections.sort(tmp); for(SC s:tmp){ selectedSC = s; s.sx=s.x-e.getX(); s.sy=s.y-e.getY(); s.zIndex=-1; s.isSelected=true; break; } for(SC s:list){ s.zIndex++; } } //鼠标释放事件处理方法 public void mouseReleased(MouseEvent e) { if(!enableDraw)return; if(selectedSC!=null){ drawArray(); drawToFace(); } else if(list.size()《total) drawBuff(e.getX(),e.getY()); } //鼠标拖动事件处理方法 public void mouseDragged(MouseEvent arg0) { if(!enableDraw){ JOptionPane.showMessageDialog(this,"请先点击 \"new\" 按钮开始作画!","警告",JOptionPane.WARNING_MESSAGE); return; } if(selectedSC!=null){ moveSc(arg0.getX(),arg0.getY()); } else if(list.size()《total) drawTmp(arg0.getX(),arg0.getY()); else JOptionPane.showMessageDialog(this,"当前画布图像已达到了预设的数量,不能继续作画!","警告",JOptionPane.WARNING_MESSAGE); } public void mouseMoved(MouseEvent arg0) {}}//图形的包装类,保存图形的相关信息class SC implements Comparable《SC》{ int x,y,w,h;//坐标和大小值 int sx,sy;//鼠标移动时产生的临时数据 Color color;//图形填充色 Shape shape;//图形 int zIndex;//Z轴的值,值越小越靠前 boolean isSelected=true;//选中状态指示值//默认是被选中的 boolean isFilled;//填充状态指示值 public int compareTo(SC sc) {//为排序比较用的方法 return zIndex-sc.zIndex; }}
以上就是小编对于js多线程ArryBuff(怎么把mysql数据库中现有的数据进行des加密,加密后的结果和jv中des加密的结果一样)问题和相关问题的解答了,js多线程ArryBuff(怎么把mysql数据库中现有的数据进行des加密,加密后的结果和jv中des加密的结果一样)的问题希望对你有用!